Scrapy Itemloader中input_processor和output_processor有何区别?

2026-06-09 10:268阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计826个文字,预计阅读时间需要4分钟。

Scrapy Itemloader中input_processor和output_processor有何区别?

Scrapy的处理器提供了多种处理器类,包括以下几种方法:Join、TakeFirst、MapCompose、Compose、Identity、SelectJmes。以下是这些方法的简单介绍:

- `Join`:将多个字段的内容连接成一个字符串。- `TakeFirst`:取第一个字段的内容。- `MapCompose`:对每个字段应用一个列表中的处理器。- `Compose`:类似于MapCompose,但返回值是一个可调用的对象,可以重复调用。- `Identity`:返回字段的原值。- `SelectJmes`:使用JSON路径选择器选择JSON字段。

使用示例:pythonfrom scrapy.loader.processors import Join, TakeFirst, MapCompose, Compose, Identity, SelectJmes

定义一个处理器列表processors=[ MapCompose(lambda x: x.strip()), # 去除空格 Compose(lambda x: int(x)), # 转换为整数 Join(), # 连接字符串]

使用处理器假设有一个字典 `item`,其中包含需要处理的数据使用MapCompose处理器item['price']=MapCompose(lambda x: x.strip(), lambda x: int(x))(item['price'])

使用Join处理器item['description']=Join()(item['description'])

使用SelectJmes处理器item['id']=SelectJmes('$.id')(item['json'])

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 Itemloader中input_processor和output_processor有何区别?

也可以在基于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()这种。

本文共计826个文字,预计阅读时间需要4分钟。

Scrapy Itemloader中input_processor和output_processor有何区别?

Scrapy的处理器提供了多种处理器类,包括以下几种方法:Join、TakeFirst、MapCompose、Compose、Identity、SelectJmes。以下是这些方法的简单介绍:

- `Join`:将多个字段的内容连接成一个字符串。- `TakeFirst`:取第一个字段的内容。- `MapCompose`:对每个字段应用一个列表中的处理器。- `Compose`:类似于MapCompose,但返回值是一个可调用的对象,可以重复调用。- `Identity`:返回字段的原值。- `SelectJmes`:使用JSON路径选择器选择JSON字段。

使用示例:pythonfrom scrapy.loader.processors import Join, TakeFirst, MapCompose, Compose, Identity, SelectJmes

定义一个处理器列表processors=[ MapCompose(lambda x: x.strip()), # 去除空格 Compose(lambda x: int(x)), # 转换为整数 Join(), # 连接字符串]

使用处理器假设有一个字典 `item`,其中包含需要处理的数据使用MapCompose处理器item['price']=MapCompose(lambda x: x.strip(), lambda x: int(x))(item['price'])

使用Join处理器item['description']=Join()(item['description'])

使用SelectJmes处理器item['id']=SelectJmes('$.id')(item['json'])

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 Itemloader中input_processor和output_processor有何区别?

也可以在基于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()这种。