В настоящее время я использую Beautiful Soup для анализа HTML-файла и вызовов get_text()
, но мне кажется, что у меня осталось много \ xa0 Unicode, представляющих пробелы. Есть ли эффективный способ удалить их все в Python 2.7 и заменить их пробелами? Я думаю, что более общий вопрос будет, есть ли способ удалить форматирование Unicode?
Я попытался использовать:, line = line.replace(u'\xa0',' ')
как предложено в другом потоке, но это изменило \ xa0 на u, так что теперь у меня вместо этого везде "u". ):
РЕДАКТИРОВАТЬ: Кажется, что проблема решена str.replace(u'\xa0', ' ').encode('utf-8')
, но просто .encode('utf-8')
без, replace()
кажется, заставляет его выплевывать даже более странные символы, например, \ xc2. Кто-нибудь может объяснить это?
u''
s вместо''
s. :-)u' '
замену, а не' '
. Является ли исходная строка юникодом?Ответы:
\ xa0 - это фактически неразрывный пробел в Latin1 (ISO 8859-1), также chr (160). Вы должны заменить его пробелом.
string = string.replace(u'\xa0', u' ')
Когда .encode ('utf-8'), он будет кодировать юникод в utf-8, это означает, что каждый юникод может быть представлен от 1 до 4 байтов. Для этого случая \ xa0 представлен 2 байтами \ xc2 \ xa0.
Читайте на http://docs.python.org/howto/unicode.html .
Пожалуйста, обратите внимание: этот ответ с 2012 года, Python перешел, вы должны быть в состоянии использовать
unicodedata.normalize
сейчасисточник
b'\xa0'
байт в кодировке latin1, как два байтаb'\xc2\xa0'
в кодировке utf-8. Это может быть представлено как
в HTML.UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 397: ordinal not in range(128)
.В
unicodedata
библиотеке Python есть много полезных вещей . Одним из них является.normalize()
функция.Пытаться:
Замените NFKD любым из других методов, перечисленных в ссылке выше, если вы не получите желаемых результатов.
источник
normalize('NFKD', '1º\xa0dia')
вернуть '1º dia', но он возвращает '1o dia'unicodedata.normalize
Попробуйте использовать .strip () в конце вашей строки,
line.strip()
у меня получилосьисточник
Попробовав несколько методов, чтобы подвести итог, я так и сделал. Ниже приведены два способа избежать / удалить символы \ xa0 из проанализированной строки HTML.
Предположим, у нас есть наш сырой HTML следующим образом:
Итак, давайте попробуем очистить эту строку HTML:
Приведенный выше код создает эти символы \ xa0 в строке. Чтобы удалить их правильно, мы можем использовать два способа.
Метод № 1 (рекомендуется): первым является get_text BeautifulSoup метод с аргументом strip в виде True, поэтому наш код становится:
Способ № 2: Другой вариант - использовать уникальные данные библиотеки Python.
Я также подробно описал эти методы в этом блоге, к которым вы можете обратиться.
источник
попробуй это:
источник
len(b'\\xa0') == 4
ноlen(b'\xa0') == 1
. Если возможно; Вы должны исправить восходящий поток, который генерирует эти побеги.Я столкнулся с этой же проблемой, извлекая некоторые данные из базы данных sqlite3 с помощью python. Приведенные выше ответы не сработали для меня (не знаю почему), но это сработало:
line = line.decode('ascii', 'ignore')
Однако моя цель была удалить \ xa0s, а не заменять их пробелами.Я получил это из этого супер-полезного учебника Юникода Неда Батчелдера.
источник
'ignore'
- это как толкание рукоятки переключения передач, даже если вы не понимаете, как работает сцепление ..str.encode(..., 'ignore')
это эквивалент обработки Unicodetry: ... except: ...
. Хотя это может скрывать сообщение об ошибке, оно редко решает проблему..decode('ascii', 'ignore')
line.decode()
в вашем ответе предполагается, что ваши входные данные являются байтовой строкой (вы не должны вызывать.decode()
строку Unicode (для ее применения метод удален в Python 3). Я не понимаю, как можно увидеть учебник, который вы связаны в вашем ответе и пропустите разницу между байтами и Unicode (не смешивайте их).Я в конечном итоге здесь, в поисках проблемы с непечатным персонажем. Я использую MySQL
UTF-8
general_ci
и имею дело с польским языком. Для проблемных строк я должен выполнить следующее:Это просто быстрый обходной путь, и вы, вероятно, должны попробовать что-то с правильной настройкой кодировки.
источник
text
это строка байтов, представляющая текст, закодированный с использованием utf-8. Если вы работаете с текстом; сначала декодируйте его в Unicode (.decode('utf-8')
) и кодируйте в байтовую строку только в самом конце (если API не поддерживает Unicode напрямую, например,socket
). Все промежуточные операции над текстом должны выполняться на Unicode.Попробуйте этот код
источник
0xA0 (Unicode) - это 0xC2A0 в UTF-8.
.encode('utf8')
просто возьму ваш Unicode 0xA0 и заменим на UTF-8 0xC2A0. Следовательно, появление 0xC2s ... Кодировка не заменяет, как вы, вероятно, поняли сейчас.источник
0xc2a0
является неоднозначным (порядок байтов).b'\xc2\xa0'
Вместо этого используйте байтовый литерал.Это эквивалент пробела, так что уберите его
источник
В Beautiful Soup вы можете передать
get_text()
параметр полосы, который удаляет пробелы в начале и конце текста. Это удалит\xa0
или любой другой пробел, если это произойдет в начале или конце строки. Beautiful Soup заменил пустую строку на,\xa0
и это решило проблему для меня.источник
strip=True
работает, только если
находится в начале или конце каждого бита текста. Он не удалит пробел, если он находится между другими символами в тексте.Универсальная версия с регулярным выражением (удаляются все управляющие символы):
источник
Python распознает его как символ пробела, так что вы можете сделать
split
это без аргументов и присоединиться к обычному пробелу:источник