Разница в синтаксическом анализе сущностей браузера и HTMLPaser

У меня есть следующий персонаж — из HTML веб-страницы. И он отображается как "-" (EM DASH) на веб-странице (через браузер Google Chrome, если это имеет значение). Независимо от того, как я играю с файловой кодировкой ("utf-8", "cp1251", "cp866"), это всегда "-" на веб-странице. Но когда я запускаю следующий код Python:

from HTMLParser import HTMLParser

h_parser = HTMLParser()
print h_parser.unescape('—')

он выводит некоторый управляющий символ "Конец охраняемой зоны" в таблице Юникода.

Какой код Python я должен использовать, чтобы получить "-" из — строка / Unicode строка. Я использую python2.7

1 ответ

Решение

Числовое значение в ссылке на символ (в вашем случае 151) относится к кодовой точке Unicode 151 (0x97), которая находится в дополнении Latin-1, где оно представляет управляющий символ.

Скорее всего, используется недопустимое значение 151, поскольку оно соответствует символу тире в кодовой странице Windows 1252. То, что оно отображается браузерами как em dash, вероятно, является попыткой справиться с этой распространенной ошибкой.

Правильная ссылка на символ для em dash &#8212,

>>> import unicodedata
>>> unicodedata.name(unichr(151))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: no such name

>>> unicodedata.lookup('em dash')
u'\u2014'
>>> unicodedata.lookup('em dash').encode('cp1252')
'\x97'

В то время как Python 2 борется с этим, в Python 3 html.unescape() Функция явно обрабатывает недопустимые ссылки на символы, как указано в спецификации HTML 5. Вы можете решить вашу проблему с помощью Python 3, если это возможно:

>>> from html import unescape
>>> unescape('&#151;')
'—'

Если вы не можете использовать Python 3, вы можете скопировать код из Python 3 html модуль (см. __init__.py файл) и передайте код HTML через него перед передачей HTMLParser,

Другие вопросы по тегам