HTML实体代码转文本

14

有没有一种简单的Python方法可以将带有HTML实体代码(例如&lt; &amp;)的字符串转换为普通字符串(例如< &)?

cgi.escape()可以转义字符串(效果不佳),但没有unescape()

4个回答

45

HTMLParser是Python标准库中具备相关功能的模块,不过遗憾的是它没有文档说明:

(Python2 文档)

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

(Python 3 文档

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

htmlentitydefs有文档可供参考,但需要你自己完成大部分工作。

如果你只需要XML预定义实体(lt、gt、amp、quot、apos),则可以使用minidom进行解析。如果你只需要预定义实体而不包括数字字符引用,则为了提高速度,甚至可以只使用普通的字符串替换。


1
+1 我不知道 HTMLParser 的那个函数。 - vartec
2
这是一个来自标准库的已记录函数,它将转换转义的HTML代码为普通字符串:http://docs.python.org/library/xml.sax.utils.html#xml.sax.saxutils.unescape - Steven T. Snyder
在Python 3.4中,它被记录 - 9000

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会将其转换回&,这与我所希望的相反。 - Dennis Golomazov

1

使用htmlentitydefs模块。这是我的旧代码,它可以工作,但我相信有更简洁和更符合Python风格的方法来完成它:

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

1

有一个内置的东西在Python标准库中用于反转义HTML。请查看被接受的答案并编辑你的答案。 - Ekrem Dinçel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接