【问题标题】:Parsing failing with LXML Xpath using utf-16使用 utf-16 解析 LXML Xpath 失败
【发布时间】:2013-02-19 17:14:13
【问题描述】:

我正在解析以下页面: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 编码解析上述页面?

【问题讨论】:

  • 我认为你应该使用tree.xpath(".//*[@id='productReviews']/tr/td[1]/div/text()")。此外,amazon.de/product-reviews/B004K1K172 以 ISO-8859-15 编码,而不是 utf-16。
  • xpath 只是用于挑选第一个评论。代码通过更改最后一个 div[n] 值来循环查看评论。我将使用 ISO-8859-15 编码检查 lxml xpath。
  • @nymk。感谢您的建议。现在我可以使用 ISO-8859-15 编码成功解析页面。

标签: python parsing xpath lxml utf-16


【解决方案1】:

自动从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()")

【讨论】:

    【解决方案2】:

    根据 nymk 的建议

    使用 ISO-8859-15 编码解析页面。因此更改代码中的以下行。

    myparser = etree.HTMLParser(encoding= "ISO-8859-15")
    但是必须在 SQL 中进行更改才能接受 utf-8 以外的编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-17
      • 2012-08-23
      • 2012-07-12
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      相关资源
      最近更新 更多