如何在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
相关产品推荐
相关产品推荐

