使用utf-16解析LXML Xpath失败

0 投票
2 回答
699 浏览
提问于 2025-04-17 17:58

我正在解析以下页面:http://www.amazon.de/product-reviews/B004K1K172,使用的是基于lxml的etree来进行解析。

内容变量包含了整个页面的内容。

代码如下:

myparser = etree.HTMLParser(encoding="utf-16") #As characters are beyond utf-8
tree = etree.HTML(content,parser = myparser)
review = tree.xpath(".//*[@id='productReviews']/tr/td[1]/div[1]/text()")

这个代码返回了一个空列表。

但是当我把代码改成:

myparser = etree.HTMLParser(encoding="utf-8") #Neglecting some reviews having ascii character above utf-8
tree = etree.HTML(content,parser = myparser)
review = tree.xpath(".//*[@id='productReviews']/tr/td[1]/div[1]/text()")

现在我用相同的Xpath得到了正确的数据。 不过大部分评论都被拒绝了。 所以这是lxml的Xpath有问题,还是我写的Xpath有问题呢?

我该如何用utf-16编码来解析上面的页面呢?

2 个回答

0

根据nymk的建议,

我用ISO-8859-15编码解析了这个页面。所以我把代码中的这一行改成了:

myparser = etree.HTMLParser(encoding="ISO-8859-15")
不过,SQL也需要做一些改动,以便接受除了utf-8以外的编码。

0

要从HTTP头信息中自动获取字符编码:

import cgi
import urllib2

from lxml import html

response = urllib2.urlopen("http://www.amazon.de/product-reviews/B004K1K172")

# extract encoding from Content-Type 
_, params = cgi.parse_header(response.headers.get('Content-Type', ''))
html_text = response.read().decode(params['charset'])

root = html.fromstring(html_text)
reviews = root.xpath(".//*[@id='productReviews']/tr/td[1]/div[1]/text()")

撰写回答