lxml 没有为 HTML 正确解析 unicode

lxml not parsing unicode properly for HTML

我正在尝试解析 HTML,但不幸的是 lxml 不允许我获取实际文本:

node = lxml.html.fromstring(r.content)
self.fingerprint['Title'] = node.cssselect('.document-title div')[0].text
print '@@####', self.fingerprint['Title']

# @@#### Démineurs

我需要做什么才能正确解析此文本?这是网页:https://play.google.com/store/movies/details/D%C3%A9mineurs?id=KChu8wf5eVo&hl=fr 文本应为 Démineurs。

该文档没有编码信息,因此您需要创建一个默认使用正确编码的解析器。

>>> lxml.html.fromstring('<p>é</p>').text
u'\xc3\xa9'
>>> hp = lxml.etree.HTMLParser(encoding='utf-8')
>>> lxml.html.fromstring('<p>é</p>', parser=hp).text
u'\xe9'

这只是一个编码问题。

看起来您正在使用 requests,这很好,因为它可以为您完成这项工作。

首先,requests guesses at the encoding,您可以使用 r.encoding 访问它。对于该页面,请求猜测为 utf-8。

可以做:

data = r.content.decode('UTF-8')
# or
data = r.content.decode(r.encoding)
# then
node = lxml.html.fromstring(data)
self.fingerprint['Title'] = node.cssselect('.document-title div')[0].text
print '@@####', self.fingerprint['Title']

有效:

@@#### Démineurs

但更好的是,只需使用 text 属性,它的输出已经正确解码。

node = lxml.html.fromstring(r.text)
self.fingerprint['Title'] = node.cssselect('.document-title div')[0].text
print '@@####', self.fingerprint['Title']

作品:

@@#### Démineurs