我目前正试图抓住这个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')
有人可以指出我做错了吗?
答案 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。