python - 为什么 response.xpath ('//html' ) 的结果与 response.body 不同?

标签 python xpath scrapy response

我正在尝试使用 scrapy 解析此页面 http://mobileshop.ae/one-x

我需要提取产品的链接。 问题是链接在 response.body 结果中可用,但如果您尝试 response.xpath('//body').extract()

response.body和response.xpath('//body')的结果是不一样的。

>>> body = response.body
>>> body_2 = response.xpath('//html').extract()[0]
>>> len(body)
238731
>>> len(body_2)
67520

response.xpath('.').extract()[0] 的相同简短结果

知道为什么会发生这种情况吗?我该如何提取所需的数据?

最佳答案

所以,这里的问题是该页面中有很多格式错误的内容,包括几个未关闭的标签。解决此问题的一种方法是使用 lxml's soupparser解析格式错误的内容(在幕后使用 BeautifulSoup)并用它构建一个 Scrapy Selector。

使用 scrapy shell http://mobileshop.ae/one-x 的示例 session :

>>> from lxml.html import soupparser
>>> from scrapy import Selector
>>> sel = Selector(_root=soupparser.fromstring(response.body))
>>> sel.xpath('//h4[@class="name"]/a').extract()
[u'<a href="http://mobileshop.ae/one-x/htc-one-x-16gb-gray">HTC One X 3G 16GB Grey</a>',
 u'<a href="http://mobileshop.ae/one-x/htc-one-x-16gb-white">HTC One X 3G 16GB White</a>',
 u'<a href="http://mobileshop.ae/one-x/htc-one-x-32gb-gray">HTC One X 3G 32GB Grey</a>',
 u'<a href="http://mobileshop.ae/one-x/htc-one-x-32gb-white">HTC One X 3G 32GB White</a>']

请注意,使用 BeautifulSoup 解析器比 lxml 的默认解析器慢很多。您可能只想在真正需要的地方执行此操作。

关于python - 为什么 response.xpath ('//html' ) 的结果与 response.body 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26956092/

相关文章:

xpath - 如何从 testcafe 中找到的多个匹配中获取该元素的第一次出现

python - 使用xpath获取图像

python - 将输入的以空格分隔的项目添加到字典中。 Python

python - 更改级别记录到 IPython/Jupyter notebook

python - 如何根据单独数据帧中列值的存在来过滤数据帧的行并附加第二个数据帧中的列

python - 只有等式约束的 CVXOPT

sql - Xquery 将 XML 标签解析为列

html - 哪个HTML元素具有特定类型的子级(例如标记)数量最多?

python - 如何使用 response.css() 和 response.follow() 在 Scrapy 中对最后一页进行分页?

javascript - 在 Python 中抓取动态内容