Подтвердить что ты не робот

Коды сущности HTML для текста

Кто-нибудь знает простой способ в Python преобразовать строку с кодами объектов HTML (например, &lt; &amp;) в обычную строку (например, < &)?

cgi.escape() будет избегать строк (плохо), но нет unescape().

4b9b3361

Ответ 1

HTMLParser имеет функциональность в стандартной библиотеке. К сожалению, это недокументировано:

(Python2 Docs)

>>> import HTMLParser
>>> h= HTMLParser.HTMLParser()
>>> h.unescape('alpha &lt; &beta;')
u'alpha < \u03b2'

(Python 3 Docs)

>>> import html.parser
>>> h = html.parser.HTMLParser()
>>> h.unescape('alpha &lt; &beta;')
'alpha < \u03b2'

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

Если вам нужны только предопределенные сущности XML (lt, gt, amp, quot, apos), вы можете использовать мини-диск для их анализа. Если вам нужны только предопределенные сущности и нет числовых ссылок на символы, вы можете просто использовать обычную замену старой строки для скорости.

Ответ 2

Я забыл пометить его сначала, но я использую BeautifulSoup.

Копаясь в документации, я обнаружил:

soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES)

делает это точно так, как я надеялся.

Ответ 3

В Python stdlib нет ничего встроенного в unescape HTML, но есть короткий script, который вы можете адаптировать к вашим потребностям в http://www.w3.org/QA/2008/04/unescape-html-entities-python.html.

Ответ 4

Используйте htmlentitydefs. Этот мой старый код, это сработало, но я уверен, что есть более чистый и более питонический способ сделать это:

e2c = dict(('&%s;'%k,eval("u'\\u%04x'"%v)) for k, v in htmlentitydefs.name2codepoint.items())