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

