用Python解码HTML实体
我正在尝试解码来自这个网站的HTML内容:NYTimes.com,但是我不知道自己哪里出错了。
举个例子:
"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
我试过使用BeautifulSoup、decode('iso-8859-1'),还有django.utils.encoding里的smart_str,但都没有成功。
4 个回答
20
其实你看到的那些并不是HTML实体。它们有三种不同的形式,比如    
这三者都表示的是 U+00A0 不换行空格。
 
(你看到的这种)是“数字字符引用”(十进制)。
 
是“数字字符引用”(十六进制)。
是一种实体。
如果想了解更多,可以看看这个链接: http://htmlhelp.com/reference/html40/entities/
这里有一段适用于Python2.x的代码,可以一次性处理这三种形式: http://effbot.org/zone/re-sub.htm#unescape-html
22
>>> 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()
。
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)