processor
scrapy提供了一个processors类,里面有下列几种方法:Join,TakeFirst,MapCompose,Compose,Identity,SelectJmes
对这几种方法的用法简单介绍一下:
from scrapy.loader.processors import Join,TakeFirst,MapCompose,Compose,Identity,SelectJmes #以特定字符连接,示例以空连接,对字符串也能操作 c = Join('') c(['a','b']) >>>'ab' #******************** #传入函数的列表的每一个元素都会经过第一个函数, #得到值在经过第二个函数,如果有返回值为None的,则抛弃, #最后返回一个列表 c=MapCompose(str.strip,str.upper) c([' a ','b']) >>>['A', 'B'] #******************** #如果传入一个列表时则会报下面这个错误 #descriptor 'strip' requires a 'str' object but received a 'list' #但如果Compose的第一个函数是取列表的第一个元素,不会报错 #即Compose是处理单一数据,MapCompose是批量处理 c=Compose(str.strip,str.upper) c(' ac ') >>>'AC' #******************** #拿到JSON格式数据时会有作用 proc = SelectJmes('a') proc({'a':'b','c':'d'}) >>>'b'
TakeFirst是取第一个不为空的元素
input--output
Item Loader 为每个 Item Field 单独提供了一个 Input processor 和一个 Output processor;
Input processor 一旦它通过 add_xpath(),add_css(),add_value() 方法收到提取到的数据便会执行,执行以后所得到的数据将仍然保存在 ItemLoader 实例中;当数据收集完成以后,ItemLoader 通过 load_item() 方法来进行填充并返回已填充的 Item 实例。
即input_processor是在收集数据的过程中所做的处理,output_processor是数据yield之后进行的处理,通过下面这个例子会更加理解:
#type字段取出来时是'type': ['2室2厅', '中楼层/共6层'] #定义一个在第一个元素后面加a的函数 def adda(value): return value[0]+'a' type = scrapy.Field(output_processor = Compose(adda)) >>>'type': '2室2厅a' type = scrapy.Field(input_processor = Compose(adda)) >>>'type': ['2室2厅a', '中楼层/共6层a']
当指定了取列表的第一个元素后,有些信息想保留整个列表便可以使用name_out,Identity()是取自身的函数。
class TeItem(ItemLoader): default_out_processor = TakeFirst() name_out = Identity()
也可以在基于scrapy.Item的item中定义一些规则:
class Scrapy1Item(scrapy.Item): name = scrapy.Field(output_processor=Identity())
优先级
scrapy提供了很多种方式去自定义输入输出的内容,具有一定的优先级,优先级最高的是name_out这种,其次是在scrapy.Field()中定义的output_processor和input_processor,最后是default_out_processor = TakeFirst()这种。
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/articles/9575038.html