Scrapy中自定义Item Loader的定义位置及处理函数编写位置咨询
嘿,恭喜你已经搞定Scrapy Item Loader的基础用法啦!关于你问的处理函数该在哪里定义,其实有几种灵活的方案,我给你挨个说清楚:
方案1:绑定到Item类(推荐的最佳实践)
这种方式最清晰,把字段的处理规则和Item本身绑定在一起,后续维护起来也方便。你可以先定义好处理器组合,然后在Item的字段里通过input_processor和output_processor指定:
import scrapy from scrapy.loader.processors import Compose, MapCompose, Join, TakeFirst # 先定义你的处理处理器组合 clean_text = Compose(MapCompose(lambda v: v.strip()), Join()) to_int = Compose(TakeFirst(), int) class CourseItem(scrapy.Item): course_title = scrapy.Field( input_processor=clean_text, output_processor=TakeFirst() # 如果需要单独设置输出处理器 ) # 举个数字字段的例子,用你定义的to_int处理器 course_duration = scrapy.Field( input_processor=MapCompose(lambda v: v.strip()), output_processor=to_int )
之后你在使用Item Loader的时候,只要加载这个Item,调用add_xpath/add_css时就会自动应用这些处理器,不用额外配置。
方案2:定义在Item Loader类里(适合批量自定义场景)
如果你的Loader需要给多个字段设置统一的默认处理器,或者要为特定字段单独定制,可以直接在Loader类里定义:
from scrapy.loader import ItemLoader from scrapy.loader.processors import Compose, MapCompose, Join, TakeFirst # 先定义处理处理器组合 clean_text = Compose(MapCompose(lambda v: v.strip()), Join()) to_int = Compose(TakeFirst(), int) class MyItemLoader(ItemLoader): # 设置所有字段的默认输入/输出处理器 default_input_processor = MapCompose(lambda v: v.strip()) default_output_processor = TakeFirst() # 为特定字段单独指定输入处理器(后缀_in对应input_processor) course_title_in = clean_text # 为数字字段指定输出处理器(后缀_out对应output_processor) course_duration_out = to_int
这样当你用MyItemLoader加载字段时,course_title会自动使用clean_text作为输入处理器,覆盖默认规则。
方案3:临时在add方法里指定(仅用于特殊一次性需求)
如果只是某个字段的某次加载需要临时用特殊处理器,也可以直接在add_xpath/add_css的第三个参数里指定:
l.add_xpath('course_title', '//*[@class="course-header-ng__main-info__name__title"]//text()', processor=clean_text)
这种方式适合临时场景,不推荐用于通用的字段处理规则。
总的来说,优先选方案1,让Item的字段规则更内聚;如果需要Loader层面的统一配置就用方案2;临时需求再考虑方案3。
内容的提问来源于stack exchange,提问作者Luis Ramon Ramirez Rodriguez
相关产品推荐
相关产品推荐

