我正在尝试解码来自NYTimes.com的HTML条目,但我无法弄清楚我做错了什么。
以此为例:
"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
我尝试了BeautifulSoup、decode('iso-8859-1')以及django.utils.encoding的smart_str,但都没有成功。
我正在尝试解码来自NYTimes.com的HTML条目,但我无法弄清楚我做错了什么。
以此为例:
"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
我尝试了BeautifulSoup、decode('iso-8859-1')以及django.utils.encoding的smart_str,但都没有成功。
>>> 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中没有记录。 它已在Python 3.4+中修复:在那里,它被公开为html.unescape()
。
实际上你所拥有的并不是HTML实体。 这些 &.....; 有三种变体,例如    
都表示U+00A0 不间断空格。
 
(您所拥有的类型)是“数字字符引用”(十进制)。
 
是“数字字符引用”(十六进制)。
是一个实体。
更多阅读: http://htmlhelp.com/reference/html40/entities/
在此处,您将找到Python2.x的代码,在一次扫描输入中执行所有三个操作:http://effbot.org/zone/re-sub.htm#unescape-html
这个确实有效:
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”这样毫无意义的类名的库。 (类和函数名称不应该是“有创意的”,它们应该是有意义的。)
试一下这个:
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)
 
和
,但然后它将在int()中崩溃 (2) 允许字符引用(它不是实体)以空格而不是';'结尾似乎非常宽容 - 您不应该提到这一点吗? (3) 最后一部分是否最好写成[;\s]? - John Machin&#
开头,但是确实应该使用 \d
。关于第二点允许以空格结尾,应该注意的是,即使它不太美观,它仍然被支持。我已经按照以下方式更新了代码:(1)将其更改为\d
,(2)使回调更强大,(3)使用前瞻断言进行结尾空格,而不是像之前那样吸收它。 - Evan Fosmark&
代替;进行FF,IE和Opera实验都产生了相同的结果:它们终止了引用并且没有被吞噬。我期待着您的更新解决方案;-) - John Machin
unescape()
函数(https://dev59.com/7nM_5IYBdhLWcg3w1G2N#20715131)。 - jfs