使用utf-16解析LXML Xpath失败
我正在解析以下页面: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()")