使用Python解码HTML实体

Key*_*upt 18 python unicode content-type beautifulsoup character-encoding

我正在尝试从这里NYTimes.com解码HTML条目,我无法弄清楚我做错了什么.

举个例子:

"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*hin 20

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

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

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

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


jfs*_*jfs 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’
Run Code Online (Sandbox Code Playgroud)

该函数在Python 2中没有记录.它在Python 3.4+中修复:它在html.unescape()那里公开.

  • 对于未来的用户来说,这个答案似乎只有很少的赞成,因为它比现有答案晚了4年.它似乎至少是一个很好的答案.这个答案的优点是它很简单(不像编写自己的函数来使用正则表达式解释HTML标准)并使用标准库(与BeautifulSoup不同).它的缺点是使用了未记录的功能. (4认同)

Gle*_*ard 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)
Run Code Online (Sandbox Code Playgroud)

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

result = decoded.encode("UTF-8")
Run Code Online (Sandbox Code Playgroud)

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

  • lxml,唉也不在标准库中,还提供了一个美丽的汤解析器(以及更多),其中一些"创意"名称较少. (2认同)

Eva*_*ark 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)
Run Code Online (Sandbox Code Playgroud)