Перейти к содержимому

Как убрать nbsp из текста python

  • автор:

Убрать часть строки с помощью regex

получается (см. после MANGO), то есть в аналогичных строках (например,

) текст удаляется,а цифры остаются,как видно ниже.

'GREAT ESCAPE', '3.95', 'MELON REFRESHER', '3.95', 'MIXED', '5.95', 'MANGO', '1.95     2.95  ', 'LYCHEE', '1.95     2.95  '

hibiscusM
01.02.19 17:49:40 MSK
vvn_black ★★★★★
( 01.02.19 17:51:45 MSK )

Some people, when confronted with a problem, think «I know, I’ll use regular expressions.» Now they have two problems. (c)

Далее: не-регулярный синтаксис (в данном случае context-free) регулярными выражениями не парсится. Использую любой доступный парсер dom и бери значения уже от туда.

beastie ★★★★★
( 01.02.19 17:55:28 MSK )
Последнее исправление: beastie 01.02.19 17:59:39 MSK (всего исправлений: 1)

Если костылять, то

>>> line1 ' ' >>> line2 '' >>> import re >>> pattern = re.compile(r'pound;[0-9]+\.[0-9]+') >>> re.search(pattern, line1).group(0).split(';')[-1] '1.95' >>> re.search(pattern, line2).group(0).split(';')[-1] '5.95'

Как удалить   из строки?

введите сюда описание изображения

при парсинге авито хотел вытащить цену которая лежит в но она имеет такой вид задача отсоединить число которое здесь должно быть 36 790 и знак рубля ₽ при этом стрипнуть все невидимые знаки &_nbsp;

for i in get_all_price: text_get_all_price = i.text text_get_all_price_strip = text_get_all_price.strip(' ') 

при принте в консоль выходит значения не стрипнутое на 20 000 видно что есть пробел , а надо что бы цифра выглядела таким образом 20000 что бы в последствии провести проверку isdigit()

Отслеживать

76.7k 6 6 золотых знаков 54 54 серебряных знака 121 121 бронзовый знак

задан 13 дек 2021 в 12:18

BadTrip174 BadTrip174

35 8 8 бронзовых знаков

Интересный нюанс с пробелами при чистке текстов функцией preg_replace

Программирование - это магия

При чистке текстов регулярными выражениями в PHP я столкнулся с интересной проблемой — некоторые пробелы игнорировались. Поиск и устранение проблемы отняло у меня не мало времени, был получен полезный опыт.

Задача состояла в том, чтобы очистить пустые абзацы в самом начале текста во множестве статей, поскольку эти абзацы там не нужны и портят общий вид статьи.

Проводим исследование

Для выполнения задачи по чистке кусков кода, представляющего пустые абзацы, я решил использовать регулярные выражения (RegExp) в PHP. Простой функцией замены подстроки здесь не обойтись, поскольку вариантов и комбинаций может быть много.

Вот некоторые варианты HTML кода, которые присутствовали в тексте и выводили пустые абзацы:

Как видим, между тегами может быть пробел, может быть его HTML-код, а также может и вовсе не быть никакого символа. Чистка таких строчек кода в текстах выполнялась регулярным выражением:

$txt=preg_replace( '#^

( |s| )+

#is' , '' , $original_text );

Статьи которые содержали ненужные пустые абзацы избавились от пустот, но в некоторых пустые абзацы вначале все же остались, посмотрев исходный код HTML одной из таких статей я увидел следующее:

Странно. два тега и несколько пробелов, возможно что-то упущено. Запустил чистку приведенным выше регулярным выражением еще раз — ничего не изменилось.

Что же это за мистика? Скопировал этот кусок кода с пробелами в буфер обмена и забросил в конвертер Text->Hex (http://www.swingnote.com/tools/texttohex.php), получаю результат:

Hex Spaced: 3c 70 3e 20 20 20 20 20 3c 2f 70 3e

Не видно ничего необычного: «20» (x20) — это код обычного пробела, функция должна была очистить эту строчку.
Решил написать регулярное выражение конкретно для этого случая:

$txt=preg_replace( '#^

x20+

#is' , '' , $original_text );

Это регулярное выражение так и не очистило указанную строчку (не заменило на пустую) – пробелы окутанные двумя тегами остались на своем месте.

Возможно что при копировании текста из браузера в буфер обмена символы как-то конвертируются, нужно как-то это все проверить.

Поможет HEX-редактор

Для выяснения что же представляет из себя эта загадочная строчка кода с двумя тегами и пробелами, решил применить HEX-редактор.

Текст был сохранен в файл с помощью PHP-функции «file_put_contents». Для того, чтобы просмотреть текстовый файл в HEX-формате, пригодилась программа под названием «HxD».

HxD — это бесплатный HEX редактор (http://mh-nexus.de/en/hxd/), программа маленького размера, бинарный файл в несколько сотен килобайт.

Открыв в HxD ранее сохраненный в файл текст строки я увидел следующее:

 3C 70 3E A0 20 A0 A0 A0 3C 2F 70 3E

Оказалось что между тегами присутствуют символ с кодом A0 (xA0), а также один символ пробела с кодом 20 (x20).

Посмотрев в таблицу с кодами символов стало понятно что это за символ с кодом xA0. Это тот же самый пробел только НЕРАЗРЫВНЫЙ:

Dec Hex Symbol HTML Number HTML name Description
160 A0     non-breaking space
32 20 space

Дополнив шаблон регулярного выражения кодом данного символа, функция выполнила чистку как положено:

$txt=preg_replace( '#^

[xA0x20]+

#is', '' , $original_text );

Заключение

Не спеша, я потратил несколько часов времени чтобы разобраться с данным нюансом. Был получен интересный опыт и проблема решена! Вот такая вот магия .

P.S. Работы проводились на PHP 5.3;

Почему при сохранении в JSON, python добавляет NBSP?

Здравствуйте.
Помогите пожалуйста разобраться с проблемой:
при сохранении спарсеного текста в json файл в некоторых местах получаю NBSP. Подскажите как это удалить? при выводе в консоль этого нет, но если скопировать из консоли текст и куда то вставить то тоже есть. Если открыть не в Pycharm то опять пропадают. Можно ли удалить их так как они создают ненужные пробелы и .replace(‘ «, ») их не берет((
Спасибо!

629ab8efef454739244924.png

  • Вопрос задан более года назад
  • 590 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 2

firedragon

Владимир Коротенко @firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.

Вы сами сказали что у вас случилось. Вы парсите файл, в нем есть неразрывные пробелы. Поэтому питон сохраняет то что вы ему даете. Все правильно. Pycharm отображает спец символы, это тоже правильно и это можно отключить.
U+202F

поэтому делаете так

Ответ написан более года назад
Нравится 1 2 комментария
DimonfromChehov @DimonfromChehov Автор вопроса

Спасибо за ваш ответ. К сожалению не сработало(( Я только начинаю изучать python и для подопытного взял сайт m видео и попробовал спарсить товар. Вот как раз при получении цены товара получаются эти отступы. значок рубля тоже почему то удалить не получается.

firedragon

Владимир Коротенко @firedragon

DimonfromChehov, значит что то пошло не так.

Показывайте код.
Вот что я вижу на мвидео

 29 999 ₽ 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *