lxml没有正确解析HTML的unicode

时间:2015-03-15 04:15:16

标签: 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

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

2 个答案:

答案 0 :(得分:5)

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

>>> 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'

答案 1 :(得分:4)

这只是一个编码问题。

看起来你正在使用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