Как работать с юникодом в Python - PullRequest
15 голосов
/ 15 апреля 2009

Я пытаюсь очистить весь HTML-код из строки, чтобы в результате получить текстовый файл. У меня есть некоторые исследования различных «преобразователей», и я начинаю склоняться к созданию собственного словаря для сущностей и символов и выполнению замены в строке. Я рассматриваю это, потому что я хочу автоматизировать процесс, и есть много различий в качестве основного HTML. Чтобы начать сравнение скорости моего решения и одной из альтернатив, например, pyparsing, я решил проверить замену \ xa0, используя метод замены строки. Я получаю

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128)

Фактическая строка кода была

s=unicodestring.replace('\xa0','')

В любом случае, я решил, что мне нужно ввести его перед r, поэтому я запустил следующую строку кода:

s=unicodestring.replace(r'\xa0','')

Он работает без ошибок, но я, когда я смотрю на кусок s, я вижу, что \ xaO все еще там

Ответы [ 6 ]

25 голосов
/ 15 апреля 2009

может быть, вы должны делать

s=unicodestring.replace(u'\xa0',u'')
6 голосов
/ 16 апреля 2009
s=unicodestring.replace('\xa0','')

.. пытается создать символ Unicode \xa0, который недопустим в sctring ASCII (тип строки по умолчанию в Python до версии 3.x)

Причина, по которой r'\xa0' не выдал ошибку, заключается в том, что в необработанной строке escape-последовательности не действуют. Вместо того, чтобы пытаться закодировать \xa0 в символ Unicode, он видел строку как «буквальный обратный слеш», «литерал x» и т. Д.

То же самое:

>>> r'\xa0'
'\\xa0'
>>> '\\xa0'
'\\xa0'

Это разрешено в Python v3, так как тип строки по умолчанию - Юникод, так что вы можете просто сделать ..

>>> '\xa0'
'\xa0'

Я пытаюсь вычистить весь HTML-код из строки, поэтому в результате получается текстовый файл

Я бы настоятельно рекомендовал BeautifulSoup для этого. Написание инструмента для очистки HTML сложно (учитывая, насколько ужасен большинство HTML), и BeautifulSoup отлично справляется как с разбором HTML, так и с Unicode.

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<html><body><h1>Hi</h1></body></html>")
>>> print soup.prettify()
<html>
 <body>
  <h1>
   Hi
  </h1>
 </body>
</html>
3 голосов
/ 15 апреля 2009

Посмотрите на стандартную библиотеку кодеков , в частности методы кодирования и декодирования , предоставляемые в базовом классе кодека.

Есть также хорошая статья здесь , которая объединяет все это.

2 голосов
/ 13 сентября 2012

Вместо этого лучше использовать стандартные функции Python.

Например:

string = unicode('Hello, \xa0World', 'utf-8', 'replace')

или

string = unicode('Hello, \xa0World', 'utf-8', 'ignore')

, где replace заменит \xa0 на \\xa0.

Но если \xa0 действительно не имеет смысла для вас, и вы хотите удалить его, используйте ignore.

1 голос
/ 15 апреля 2009

Просто примечание относительно очистки HTML. Это очень очень тяжело, так как

<
body
>

Это правильный способ написания HTML. Просто к вашему сведению.

0 голосов
/ 15 апреля 2009

Вы можете преобразовать его в Unicode следующим образом:

print u'Hello, \xa0World'  # print Hello,  World
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...