lxml没有正确解析HTML的unicode

Dav*_*542 4 python unicode lxml

我试图解析HTML,但遗憾的lxml是不允许我抓取实际文本:

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

# @@#### Démineurs
Run Code Online (Sandbox Code Playgroud)

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

Ign*_*ams 6

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

>>> 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'
Run Code Online (Sandbox Code Playgroud)


jed*_*rds 5

这只是一个编码问题。

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

首先,请求猜测编码,您可以使用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']
Run Code Online (Sandbox Code Playgroud)

哪个有效:

@@#### Démineurs
Run Code Online (Sandbox Code Playgroud)

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

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

作品:

@@#### Démineurs
Run Code Online (Sandbox Code Playgroud)