在Pythonstring中解码HTML实体?
我正在使用Beautiful Soup 3parsing一些HTML,但是它包含了一个Beautiful Soup 3不会自动为我解码的HTML实体:
>>> from BeautifulSoup import BeautifulSoup >>> soup = BeautifulSoup("<p>£682m</p>") >>> text = soup.find("p").string >>> print text £682m
我如何解码text
的HTML实体来获得"£682m"
而不是"£682m"
。
Python 3.4+
HTMLParser.unescape
已经被弃用了, 应该在3.5版本中被删除 ,尽pipe它被遗漏了。 它将很快从语言中删除。 相反,使用html.unescape()
:
import html print(html.unescape('£682m'))
请参阅https://docs.python.org/3/library/html.html#html.unescape
Python 2.6-3.3
您可以使用标准库中的HTMLparsing器:
>>> try: ... # Python 2.6-2.7 ... from HTMLParser import HTMLParser ... except ImportError: ... # Python 3 ... from html.parser import HTMLParser ... >>> h = HTMLParser() >>> print(h.unescape('£682m')) £682m
请参阅http://docs.python.org/2/library/htmlparser.html
您也可以使用six
兼容性库来简化导入:
>>> from six.moves.html_parser import HTMLParser >>> h = HTMLParser() >>> print(h.unescape('£682m')) £682m
美丽的汤把柄实体转换。 在Beautiful Soup 3中,您需要指定BeautifulSoup
构造函数的convertEntities
参数(请参阅存档文档的“实体转换”部分)。 在美丽的汤4,实体自动解码。
美丽的汤3
>>> from BeautifulSoup import BeautifulSoup >>> BeautifulSoup("<p>£682m</p>", ... convertEntities=BeautifulSoup.HTML_ENTITIES) <p>£682m</p>
美丽的汤4
>>> from bs4 import BeautifulSoup >>> BeautifulSoup("<p>£682m</p>") <html><body><p>£682m</p></body></html>
您可以使用w3lib.html库中的replace_entities
In [202]: from w3lib.html import replace_entities In [203]: replace_entities("£682m") Out[203]: u'\xa3682m' In [204]: print replace_entities("£682m") £682m
美丽的汤4允许您设置一个格式化程序到您的输出
如果你传入
formatter=None
,Beautiful Soup将不会在输出上修改string。 这是最快的select,但可能会导致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>
这可能与此无关。 但是为了从整个文档中删除这些html实体,你可以这样做:(假设文档=页面,请原谅这个潦草的代码,但如果你有如何使它更好的想法,我所有的耳朵 – 我是新来的这个)。
import re import HTMLParser regexp = "&.+?;" list_of_html = re.findall(regexp, page) #finds all html entites in page for e in list_of_html: h = HTMLParser.HTMLParser() unescaped = h.unescape(e) #finds the unescaped value of the html entity page = page.replace(e, unescaped) #replaces html entity with unescaped value