爬虫蜘蛛项目加载器Item Loader类详解之声明项目加载器和输入输出处理器 (20)python SCRAPY最新教程1.51以上版本
声明项目加载器
通过使用类定义语法将Item Loaders声明为Items。这是一个例子:
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose, Join
class ProductLoader(ItemLoader):
default_output_processor = TakeFirst()
name_in = MapCompose(unicode.title)
name_out = Join()
price_in = MapCompose(unicode.strip)
# ...
如您所见,输入处理器使用_in
后缀声明,而输出处理器使用_out
后缀声明。您还可以使用ItemLoader.default_input_processor
和 ItemLoader.default_output_processor
属性声明默认的输入/输出处理器 。
声明输入和输出处理器
如上一节所示,输入和输出处理器可以在Item Loader定义中声明,以这种方式声明输入处理器是很常见的。但是,还有一个地方可以指定要使用的输入和输出处理器:在项目字段 元数据中。这是一个例子:
import scrapy
from scrapy.loader.processors import Join, MapCompose, TakeFirst
from w3lib.html import remove_tags
def filter_price(value):
if value.isdigit():
return value
class Product(scrapy.Item):
name = scrapy.Field(
input_processor=MapCompose(remove_tags),
output_processor=Join(),
)
price = scrapy.Field(
input_processor=MapCompose(remove_tags, filter_price),
output_processor=TakeFirst(),
)
>>> from scrapy.loader import ItemLoader
>>> il = ItemLoader(item=Product())
>>> il.add_value('name', [u'Welcome to my', u'<strong>website</strong>'])
>>> il.add_value('price', [u'€', u'<span>1000</span>'])
>>> il.load_item()
{'name': u'Welcome to my website', 'price': u'1000'}
输入和输出处理器的优先顺序如下:
- Item Loader特定于字段的属性:
field_in
和field_out
(最优先) - 字段元数据(
input_processor
和output_processor
键) - Item Loader默认值:
ItemLoader.default_input_processor()
和ItemLoader.default_output_processor()
(最少优先级)
另请参阅:重用和扩展项目加载器。
项目加载器上下文
Item Loader Context是任意键/值的dict,它在Item Loader中的所有输入和输出处理器之间共享。它可以在声明,实例化或使用Item Loader时传递。它们用于修改输入/输出处理器的行为。
例如,假设您有一个函数parse_length
接收文本值并从中提取长度:
def parse_length(text, loader_context):
unit = loader_context.get('unit', 'm')
# ... length parsing code goes here ...
return parsed_length
通过接受loader_context
参数,函数显式地告诉Item Loader它能够接收Item Loader上下文,因此Item Loader在调用它时传递当前活动的上下文,并且处理器函数(parse_length
在这种情况下)可以使用它们。
有几种方法可以修改Item Loader上下文值:
-
通过修改当前活动的Item Loader上下文(
context
属性):loader = ItemLoader(product) loader.context['unit'] = 'cm'
-
在Item Loader实例化中(Item Loader构造函数的关键字参数存储在Item Loader上下文中):
loader = ItemLoader(product, unit='cm')
-
在Item Loader声明中,对于那些支持使用Item Loader上下文实例化它们的输入/输出处理器。
MapCompose
是其中之一:class ProductLoader(ItemLoader): length_out = MapCompose(parse_length, unit='cm')
评论被关闭。