无法使用scrapy刮取结果列表中的数据

时间:2014-11-15 16:20:09

标签: python xpath web-scraping scrapy

我目前正试图抓住这个page上车辆的链接。

我在chrome控制台上运行了这个xpath命令,以返回每辆车的链接

$x('//div[@class="vehicle-make-model"]/h3/a/@href')

但是,当我尝试使用相同的xpath时,在使用scrapy shell命令时,它不会返回任何链接。这是我为scrapy shell命令运行的代码

response.xpath('//div[@class="vehicle-make-model"]/h3/a/@href')

有人可以指出我做错了吗?

1 个答案:

答案 0 :(得分:1)

在Chrome中运行的XPath运行在使用JavaScript构建的DOM之上。 这就是为什么有时一件事在Chrome中起作用但在scrapy shell中不起作用。

您链接的页面就是这种情况。如果您查看页面的来源(右键单击并选择“查看页面源”或按Ctrl-U),您将看到与Scrapy相同的数据。

在这种特殊情况下,数据似乎都在一个JSON块中,因此您可以提取JSON代码并使用python的JSON模块解析它,例如:

import json
raw_json = response.xpath(
    "//script[contains(., 'window.jsonData')]/text()"
).re('window.jsonData\s*=\s*(.+);$')[0]
json_data = json.loads(raw_json)

然后,您可以使用json_data中的数据构建下一个请求,或者抓取您需要的任何内容。

如果没有一个易于解析的JSON,另一个选择是使用js2xml库将JavaScript解析成一个你可以使用XPath抓取的XML。