声明项目加载

通过使用类定义语法将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'&euro;', u'<span>1000</span>'])
>>> il.load_item()
{'name': u'Welcome to my website', 'price': u'1000'}

输入和输出处理器的优先顺序如下:

  1. Item Loader特定于字段的属性:field_infield_out(最优先)
  2. 字段元数据(input_processoroutput_processor键)
  3. 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上下文值:

  1. 通过修改当前活动的Item Loader上下文(context属性):

    loader = ItemLoader(product)
    loader.context['unit'] = 'cm'
  2. Item Loader实例化中(Item Loader构造函数的关键字参数存储在Item Loader上下文中):

    loader = ItemLoader(product, unit='cm')
  3. Item Loader声明中,对于那些支持使用Item Loader上下文实例化它们的输入/输出处理器。MapCompose是其中之一:

    class ProductLoader(ItemLoader):
        length_out = MapCompose(parse_length, unit='cm')

评论被关闭。