用Python解码HTML实体

19 投票
4 回答
24217 浏览
提问于 2025-04-15 13:17

我正在尝试解码来自这个网站的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)

撰写回答