我正在尝试解码来自NYTimes.com的HTML条目,我无法弄清楚我做错了什么。
以例如:
"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
我尝试过BeautifulSoup,解码('iso-8859-1')和django.utils.encoding的smart_str,但没有成功。
答案 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)