使用Python解码HTML实体

时间:2009-07-30 19:47:34

标签: python unicode character-encoding content-type beautifulsoup

我正在尝试解码来自NYTimes.com的HTML条目,我无法弄清楚我做错了什么。

以例如:

"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"

我尝试过BeautifulSoup,解码('iso-8859-1')和django.utils.encoding的smart_str,但没有成功。

4 个答案:

答案 0 :(得分:20)

实际上你所拥有的不是HTML实体。这些& .....三种;东西 - 例如     都意味着U + 00A0 NO-BREAK SPACE。

 (您拥有的类型)是“数字字符引用”(十进制)  是“数字字符引用”(十六进制)  是一个实体。

进一步阅读:http://htmlhelp.com/reference/html40/entities/

在这里,您将找到Python2.x的代码,它通过输入执行所有三个扫描:http://effbot.org/zone/re-sub.htm#unescape-html

答案 1 :(得分:19)

>>> from HTMLParser import HTMLParser
>>> print HTMLParser().unescape('U.S. Adviser’s Blunt Memo on Iraq: '
...                             'Time ‘to Go Home’')
U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’

该功能在Python 2中未记录。It is fixed in Python 3.4+:它显示为html.unescape() there

答案 2 :(得分:18)

这确实有效:

from BeautifulSoup import BeautifulStoneSoup
s = "U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
decoded = BeautifulStoneSoup(s, convertEntities=BeautifulStoneSoup.HTML_ENTITIES)

如果你想要一个字符串而不是一个Unicode对象,你需要将它解码为支持所用字符的编码; ISO-8859-1没有:

result = decoded.encode("UTF-8")

不幸的是,你需要一个外部模块来做这样的事情;简单的HTML / XML实体解码应该在标准库中,并且不要求我使用具有无意义类名的库,例如“BeautifulStoneSoup”。 (类和函数名称不应该是“有创意的”,它们应该是有意义的。)

答案 3 :(得分:6)

试试这个:

import re

def _callback(matches):
    id = matches.group(1)
    try:
        return unichr(int(id))
    except:
        return id

def decode_unicode_references(data):
    return re.sub("&#(\d+)(;|(?=\s))", _callback, data)

data = "U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
print decode_unicode_references(data)