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

如何修改Scrapy ItemLoader默认行为以保留空值与0值字段

如何让Scrapy ItemLoader保留None或0值字段?

Scrapy的ItemLoader默认会丢弃None和0值字段,目前我用-1替代0来标记空值,但这并非最优方案。希望找到调整ItemLoader设置的方法实现保留这类值,或明确是否无法实现该需求。

现状代码

当前使用的处理器代码(用-1替代空值):

Compose(lambda v: v[0].split()[0] if v else "-1", int) # if none; then -1

期望实现的代码(用0替代空值,且希望ItemLoader保留该0值):

Compose(lambda v: v[0].split()[0] if v else "0", int) # if none; then 0

查阅资料后的尝试

从GitHub仓库及旧版文档中找到相关提示:

默认情况下,遇到None值时停止处理。可通过传入stop_on_none=False参数修改该行为。
每个函数可选择性接收loader_context参数,处理器会将当前活跃的Loader上下文传入该参数。
构造函数中传入的关键字参数作为默认Loader上下文值传递给函数调用,但最终传递给函数的Loader上下文值会被ItemLoader.context()属性中的当前活跃上下文覆盖。

尝试了以下基于文档的修改方式,均未生效:

# 在Compose处理器中添加stop_on_none参数
Compose(lambda v: v[0].split()[0] if v else "0", int, stop_on_none=False)

# 实例化ItemLoader时传入stop_on_none参数
comment_loader = ItemLoader(item=comment(), selector=article, stop_on_none=False) # 无效

# 修改ItemLoader的上下文属性
comment_loader.context["stop_on_none"] = False # 无效

最终结论

进一步查阅GitHub仓库的问题后确认:这是Scrapy库的设计特性,ItemLoader会默认丢弃None及0值,目前没有可行的配置方法修改这一行为,且官方未来大概率不会调整(避免破坏现有项目的兼容性)。

内容的提问来源于stack exchange,提问作者Kyle A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:10:18