Как работать с unicode в Python

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

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 все еще там

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

То же самое:

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

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

>>> '\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

Посмотрите на стандартную библиотеку codecs, в частности encode и декодировать. > в базовом классе Codec.

Здесь также есть хорошая статья , которая ставит все это вместе.

Ответ 4

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

Например:

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

или

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

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

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

Ответ 5

Просто обратите внимание на очистку HTML. Это очень сложно, так как

<
body
>

Является допустимым способом написания HTML. Просто fyi.

Ответ 6

Вы можете преобразовать его в unicode таким образом:

print u'Hello, \xa0World'  # print Hello,  World