2009-03-19 5 views
12

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

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

ответ

37

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), вы можете использовать мини-диск для их анализа. Если вам нужны только предопределенные объекты и нет числовых ссылок на символы, вы можете просто использовать обычную замену старой строки для скорости.

+1

+1 Я не знал, что функция HTMLParser – vartec

+2

Вот документальная функция из стандартной библиотеки, которая преобразует экранированный HTML-код в обычную строку: http://docs.python.org/library/xml.sax. utils.html # xml.sax.saxutils.unescape –

+0

В Python 3.4 было [задокументировано] (https://docs.python.org/3/library/html.html#html.unescape). – 9000

1

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

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

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

копаться в документации, я нашел:

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

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

+4

Это работает только для версий BeautifulSoup до BS4. Если вы используете BS4, вы должны использовать форматировщик: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#output-formatters – kronion

+2

он не работает для & Фактически, если строка содержит '&' , BeautifulSoup преобразует его обратно в &, что является противоположностью тому, что я надеялся. –