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

如何在Scrapy中动态生成yield字段抓取亚马逊产品页项目符号?

在Scrapy中动态生成yield字段的实现方法

当然可以实现这种动态生成字段的操作,而且这比手动写死字段要更灵活、更稳妥——毕竟亚马逊产品的卖点数量不固定,手动定义字段不仅繁琐,还容易因为卖点数量不足出现索引越界的错误。

具体实现代码

你可以先初始化一个结果字典,先加入固定字段(比如商品URL、卖点总数),再通过遍历动态添加每个卖点字段,最后yield这个字典即可:

def parse(self, response):
    # 初始化结果字典
    result = {}
    # 添加固定字段:商品URL
    result['url'] = response.request.url
    # 获取所有卖点的选择器列表
    bullets = response.xpath('//div[@id="feature-bullets"]//li/span/text()')
    # 添加卖点数字段
    result['bullets_no'] = len(bullets)
    # 遍历卖点,动态生成字段
    for i, bullet_selector in enumerate(bullets, start=1):
        # 提取文本并去除首尾空白,处理可能的空值
        bullet_text = bullet_selector.get(default='').strip()
        if bullet_text:  # 过滤空文本
            result[f'bullet_{i}'] = bullet_text
    # 输出结果
    yield result

代码说明

  • 先创建空字典result,用来存储所有字段,避免手动写死键名的麻烦。
  • 用enumerate(bullets, start=1)直接从1开始计数,刚好对应bullet_1、bullet_2的命名规则。
  • 使用get(default='')避免某个卖点节点不存在时返回None,调用strip()会报错的问题。
  • 增加了空文本过滤,避免抓取到无意义的空白内容。

补充说明

如果你不需要把每个卖点拆成单独字段,也可以直接把所有卖点放到一个列表字段里,这种写法更简洁:

def parse(self, response):
    bullets = [text.strip() for text in response.xpath('//div[@id="feature-bullets"]//li/span/text()').getall() if text.strip()]
    yield {
        'url': response.request.url,
        'bullets_no': len(bullets),
        'bullets_list': bullets
    }

不过这取决于你对数据格式的需求,如果你必须要bullet_1、bullet_2这种单独字段,第一种动态生成的方式完全满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:41:32