Разница в синтаксическом анализе сущностей браузера и 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 —
,
>>> 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('—')
'—'
Если вы не можете использовать Python 3, вы можете скопировать код из Python 3 html
модуль (см. __init__.py
файл) и передайте код HTML через него перед передачей HTMLParser
,