Item Loader包含一个输入处理器和一个输出处理器,用于每个(item)字段。输入处理器只要它接收处理所提取的数据(通过add_xpath()add_css()或 add_value()方法)和输入处理器的结果被收集和保持在ItemLoader内部。收集所有数据后,ItemLoader.load_item()调用该 方法来填充并获取填充的 Item对象。这是在使用先前收集的数据(并使用输入处理器处理)调用输出处理器时。输出处理器的结果是分配给项目的最终值。

让我们看一个例子来说明如何为特定字段调用输入和输出处理器(同样适用于任何其他字段):

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)

那么会发生什么:

  1. 从数据xpath1提取出来,并通过所传递的输入处理器的的name字段。输入处理器的结果被收集并保存在Item Loader中(但尚未分配给该项目)。
  2. xpath2提取数据,并通过(1)中使用的相同输入处理器。输入处理器的结果附加到(1)中收集的数据(如果有的话)。
  3. 这种情况类似于前面的情况,除了从cssCSS选择器中提取数据,并通过(1)和(2)中使用的相同输入处理器。输入处理器的结果附加到(1)和(2)中收集的数据(如果有的话)。
  4. 这种情况也类似于以前的情况,除了直接分配要收集的值,而不是从XPath表达式或CSS选择器中提取。但是,该值仍然通过输入处理器传递。在这种情况下,由于该值不可迭代,因此在将其传递给输入处理器之前将其转换为单个元素的可迭代,因为输入处理器始终接收可迭代
  5. 在步骤(1),(2),(3)和(4)中收集的数据通过该字段的输出处理器name。输出处理器的结果是分配给name 项目中字段的值。

值得注意的是,处理器只是可调用对象,可以使用要解析的数据调用它们,并返回解析后的值。因此您可以使用任何功能作为输入或输出处理器。唯一的要求是它们必须接受一个(且只有一个)位置参数,它将是一个迭代器。

注意

输入和输出处理器都必须接收迭代器作为它们的第一个参数。这些功能的输出可以是任何东西。输入处理器的结果将附加到包含收集值(对于该字段)的内部列表(在Loader中)。输出处理器的结果是最终分配给项目的值。

如果要将普通函数用作处理器,请确保将其self作为第一个参数接收 :

def lowercase_processor(self, values):
    for v in values:
        yield v.lower()

class MyItemLoader(ItemLoader):
    name_in = lowercase_processor

这是因为无论何时将函数指定为类变量,它都会成为一个方法,并在被调用时将实例作为第一个参数传递。有关详细信息,请参阅stackoverflow上的此答案。

您需要记住的另一件事是输入处理器返回的值在内部收集(在列表中),然后传递给输出处理器填充字段。

最后,但并非最不重要的是,为了方便起见,Scrapy 内置了一些常用的处理器

评论被关闭。