我正在尝试解析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。
答案 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