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