在Python字符串中解码HTML实体?

378 投票
7 回答
345702 浏览
提问于 2025-04-15 18:09

我正在用Beautiful Soup 3解析一些HTML代码,但里面有一些HTML实体,而Beautiful Soup 3并不会自动帮我解码这些实体:

>>> from BeautifulSoup import BeautifulSoup

>>> soup = BeautifulSoup("<p>&pound;682m</p>")
>>> text = soup.find("p").string

>>> print text
&pound;682m

我该怎么做才能把text中的HTML实体解码,得到"£682m"而不是"&pound;682m"呢?

相关问题:

7 个回答

16

你可以使用 w3lib.html 库中的 replace_entities 函数。

In [202]: from w3lib.html import replace_entities

In [203]: replace_entities("&pound;682m")
Out[203]: u'\xa3682m'

In [204]: print replace_entities("&pound;682m")
£682m
72

Beautiful Soup可以处理实体转换。在Beautiful Soup 3中,你需要在创建BeautifulSoup对象时指定convertEntities这个参数(具体可以查看'实体转换'的文档部分)。而在Beautiful Soup 4中,实体会自动被解码,不需要额外设置。

Beautiful Soup 3

>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>", 
...               convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>

Beautiful Soup 4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>")
<html><body><p>£682m</p></body></html>
723

Python 3.4及以上版本

可以使用 html.unescape() 方法:

import html
print(html.unescape('&pound;682m'))

顺便提一下,html.parser.HTMLParser.unescape 这个方法已经不推荐使用了,原本计划在3.5版本中移除,不过因为错误暂时保留了。这个方法很快就会被彻底移除。


Python 2.6到3.3版本

可以使用标准库中的 HTMLParser.unescape() 方法:

>>> try:
...     # Python 2.6-2.7 
...     from HTMLParser import HTMLParser
... except ImportError:
...     # Python 3
...     from html.parser import HTMLParser
... 
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m

你也可以使用 six 这个兼容库来简化导入过程:

>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m

撰写回答