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

Scrapy XPath查询返回<li>列表但仅重复首个元素的问题求助

问题原因与解决办法

核心问题

你循环里写的//@data-lurker_list_id这类XPath表达式,是从整个文档的根节点开始搜索的,所以每次都会返回文档里第一个匹配的属性值,自然所有循环项都重复第一个元素的数据。

修复代码

把XPath表达式改成相对路径,在开头加个.,表示从当前item节点的上下文里查找:

def parse(self, response):
    # 别用list当变量名,这是Python内置类型,容易出问题
    ad_links = response.xpath('//ul[@id="ad-list"]/li//a[@data-ds-component="DS-Link"]')
    for item in ad_links: 
        newItem = Item()  # 每次循环都要新建Item实例,不然会覆盖之前的数据
        newItem["product_id"] = item.xpath('.//@data-lurker_list_id').get()
        newItem["url"] = item.xpath('.//@href').get()
        newItem["title"] = item.xpath('.//@title').get()
        # 记得yield或者处理这个newItem,不然数据没输出
        yield newItem

额外提醒

  • 避免用list作为变量名,会覆盖Python自带的list类型,引发不必要的bug。
  • 必须在循环内创建Item实例,如果在循环外创建,后续赋值会修改同一个对象,最后所有结果都会变成最后一次循环的数据。

内容的提问来源于stack exchange,提问作者Breno Rios Ramos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:03:10