scrapy 2.3 输入和输出处理器
项目加载器为每个(项目)字段包含一个输入处理器和一个输出处理器。输入处理器一旦接收到提取的数据(通过 add_xpath()
, add_css()
或 add_value()
方法),输入处理器的结果被收集并保存在itemloader中。在收集所有数据之后, ItemLoader.load_item()
方法来填充和获取填充的 item
object . 此时,将使用先前收集的数据(并使用输入处理器处理)调用输出处理器。输出处理器的结果是分配给项目的最终值。
让我们看一个例子来说明如何为一个特定的字段调用输入和输出处理器(这同样适用于任何其他字段)::
l = ItemLoader(Product(), some_selector)
l.add_xpath('name', xpath1) # (1)
l.add_xpath('name', xpath2) # (2)
l.add_css('name', css) # (3)
l.add_value('name', 'test') # (4)
return l.load_item() # (5)
所以发生的是:
- 数据来自
xpath1
提取并通过 输入处理器 的 name
字段。输入处理器的结果被收集并保存在项目加载器中(但尚未分配给项目)。 - 数据来自
xpath2
提取并通过 输入处理器 用于(1)。输入处理器的结果将附加到(1)中收集的数据(如果有)中。 - 这种情况与以前的情况类似,只是数据是从
css
并通过相同的 输入处理器 用于(1)和(2)。输入处理器的结果将附加到(1)和(2)中收集的数据(如果有)中。 - 这种情况也与前面的情况类似,只是要收集的值是直接分配的,而不是从xpath表达式或css选择器中提取的。但是,该值仍然通过输入处理器传递。在这种情况下,由于该值不可重设,因此在将其传递给输入处理器之前,它将转换为单个元素的可重设值,因为输入处理器始终接收可重设值。
- 步骤(1)、(2)、(3)和(4)中收集的数据通过 输出处理器 的
name
字段。输出处理器的结果是分配给 name
项目中的字段。
值得注意的是,处理器只是可调用的对象,它们与要解析的数据一起调用,并返回已解析的值。所以你可以使用任何函数作为输入或输出处理器。唯一的要求是它们必须接受一个(而且只有一个)位置参数,这将是一个iterable。
在 2.0 版更改: 处理器不再需要是方法。
注解
输入和输出处理器都必须接收iterable作为其第一个参数。这些函数的输出可以是任何东西。输入处理器的结果将被附加到一个内部列表中(在加载程序中),其中包含收集的值(对于该字段)。输出处理器的结果是最终分配给项目的值。
您需要记住的另一件事是,输入处理器返回的值在内部收集(在列表中),然后传递给输出处理器来填充字段。
最后,但并非最不重要, itemloaders 有一些 commonly used processors 内置方便。