Кто-нибудь знает простой способ в Python преобразовать строку с кодами объектов HTML (например, <
&
) в обычную строку (например, < &)?
cgi.escape()
будет избегать строк (плохо), но нет unescape()
.
Кто-нибудь знает простой способ в Python преобразовать строку с кодами объектов HTML (например, <
&
) в обычную строку (например, < &)?
cgi.escape()
будет избегать строк (плохо), но нет unescape()
.
HTMLParser имеет функциональность в стандартной библиотеке. К сожалению, это недокументировано:
(Python2 Docs)
>>> import HTMLParser
>>> h= HTMLParser.HTMLParser()
>>> h.unescape('alpha < β')
u'alpha < \u03b2'
(Python 3 Docs)
>>> import html.parser
>>> h = html.parser.HTMLParser()
>>> h.unescape('alpha < β')
'alpha < \u03b2'
htmlentitydefs задокументирован, но требует, чтобы вы выполняли большую часть работы самостоятельно.
Если вам нужны только предопределенные сущности XML (lt, gt, amp, quot, apos), вы можете использовать мини-диск для их анализа. Если вам нужны только предопределенные сущности и нет числовых ссылок на символы, вы можете просто использовать обычную замену старой строки для скорости.
Я забыл пометить его сначала, но я использую BeautifulSoup.
Копаясь в документации, я обнаружил:
soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES)
делает это точно так, как я надеялся.
В Python stdlib нет ничего встроенного в unescape HTML, но есть короткий script, который вы можете адаптировать к вашим потребностям в http://www.w3.org/QA/2008/04/unescape-html-entities-python.html.
Используйте htmlentitydefs. Этот мой старый код, это сработало, но я уверен, что есть более чистый и более питонический способ сделать это:
e2c = dict(('&%s;'%k,eval("u'\\u%04x'"%v)) for k, v in htmlentitydefs.name2codepoint.items())