You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy Shell中XPath查询返回空结果的问题求助

问题解决指南:Scrapy Shell 返回空结果的原因与修复方案

嘿,我帮你定位到问题啦!你用Scrapy Shell抓不到产品数据,主要是XPath路径使用错误导致的,另外也得考虑页面是否是动态渲染的情况,下面给你一步步拆解解决:

1. 核心问题:混淆了绝对路径与相对路径

你代码里的XPath都用了//,这是绝对路径——每次查询都会从整个HTML文档的根节点重新开始查找,而不是从你当前选中的节点内部往下找。比如在循环li_tile时,//div[@class="product"]会遍历整个文档找所有匹配的div,而不是从当前的li元素里找,这就导致了空结果。

修正后的代码

把所有子节点查询的//改成.//(.代表从当前节点开始查找),代码如下:

$ scrapy shell
fetch("https://www.newbalance.co.nz/men/shoes/running/trail/?prefn1=sizeRefinement&prefv1=men_shoes_7")
# 获取产品列表容器
div_product_lists = response.xpath('//div[@id="product-lists"]')
# 从容器内部找主列表ul
ul_product_list_main = div_product_lists.xpath('.//ul[@id="product-list-main"]')
# 从ul内部遍历每个tile li
for li_tile in ul_product_list_main.xpath('.//li[@class="tile"]'):
    # 从当前li内部查找product div
    print(li_tile.xpath('.//div[@class="product"]').extract())

2. 简化XPath查询(可选)

你可以把多层XPath合并成一步,这样更简洁也不容易出错:

for product in response.xpath('//div[@id="product-lists"]//ul[@id="product-list-main"]//li[@class="tile"]//div[@class="product"]'):
    print(product.extract())

3. 排查动态渲染可能性

如果修正XPath后还是没有结果,那大概率是页面通过JavaScript动态加载产品数据:

  • 在Scrapy Shell里输入view(response),打开Scrapy实际抓取到的页面。如果页面里没有产品列表,说明静态HTML里没有这些内容,需要用工具处理动态页面,比如scrapy-splash或者playwright。
  • 也可以打开浏览器开发者工具的「Network」面板,看看页面是否通过API请求加载产品数据。如果能找到对应的API接口,直接爬取API会比解析HTML更高效可靠。

内容的提问来源于stack exchange,提问作者Patrick Rynhart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:45:56