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

jkp*_*jkp 239 html python html-entities

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我怎样才能解码HTML实体中text获得"£682m",而不是"&pound;682m".

luc*_*luc 472

Python 3.4+

html.unescape()已被弃用,并且应该在3.5中删除,尽管它是错误的.它将很快从语言中删除.相反,使用html.parser.HTMLParser.unescape:

import html
print(html.unescape('&pound;682m'))
Run Code Online (Sandbox Code Playgroud)

请参阅https://docs.python.org/3/library/html.html#html.unescape


Python 2.6-3.3

您可以使用标准库中的HTML解析器:

>>> 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
Run Code Online (Sandbox Code Playgroud)

请参见http://docs.python.org/2/library/htmlparser.html

您还可以使用HTMLParser.unescape()兼容性库来简化导入:

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

  • 这种方法似乎没有像"&#8217;"那样转义字符.在谷歌应用程序引擎上,虽然它在python2.6本地工作.它仍然至少解码实体(如")" (6认同)

Ben*_*mes 63

美丽的汤处理实体转换.在Beautiful Soup 3中,您需要为构造函数指定convertEntities参数BeautifulSoup(请参阅存档文档的"实体转换"部分).在Beautiful Soup 4中,实体会自动解码.

美丽的汤3

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

美丽的汤4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>")
<html><body><p>£682m</p></body></html>
Run Code Online (Sandbox Code Playgroud)

  • `BeautifulSoup4`主要使用`HTMLParser`.参见[来源](http://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/builder/_htmlparser.py) (5认同)
  • 我们如何在没有所有不属于原始字符串的无关HTML的情况下在Beautiful Soup 4中获得转换?(即<html>和<body>) (4认同)

Cor*_*vax 13

您可以使用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
Run Code Online (Sandbox Code Playgroud)


Loi*_*cUV 6

Beautiful Soup 4 允许您为输出设置格式化程序

如果传入formatter=None,Beautiful Soup 在输出时根本不会修改字符串。这是最快的选项,但它可能会导致 Beautiful Soup 生成无效的 HTML/XML,如下例所示:

print(soup.prettify(formatter=None))
# <html>
#  <body>
#   <p>
#    Il a dit <<Sacré bleu!>>
#   </p>
#  </body>
# </html>

link_soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
print(link_soup.a.encode(formatter=None))
# <a href="http://example.com/?foo=val1&bar=val2">A link</a>
Run Code Online (Sandbox Code Playgroud)