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

Scrapy循环提取商品价格时XPath失效CSS选择器生效原因问询

问题原因

这个问题的核心是XPath路径的定位规则使用错误:

  • XPath中路径以//开头时,默认从整个文档的根节点开始全局检索,不会限定在你当前选中的商品元素p的范围内。所以你每次循环调用p.xpath("//span[@class='price']//child::bdi/text()").get(),实际都是匹配全页面所有价格,永远返回第一个匹配结果,自然每次都拿到第一个商品的134.99。
  • 而CSS选择器默认就是基于当前选中元素的相对路径检索,所以p.css("span.price bdi::text").get()会从p对应的单个商品节点下查找价格,能正确返回每个商品的对应值。
正确的XPath写法

如果要让XPath基于当前节点检索,需要在路径开头加.,代表限定在当前节点的上下文范围内查询:

p.xpath(".//span[@class='price']//child::bdi/text()").get()

修改后就可以和CSS选择器一样,从每个商品元素p的子节点中匹配价格,拿到正确的结果。

额外优化建议

你最初获取商品列表的XPath逻辑有偏差,ancestor::li是查找当前节点的祖先li节点,正常商品li是ul.products的直接子节点,建议改成更准确的写法避免匹配到无关节点:

products = response.xpath("//ul[@class='products']/li")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:15:11