爬虫蜘蛛项目加载器Item Loader类详解之输入输出处理器 (19)python SCRAPY最新教程1.51以上版本
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)
那么会发生什么:
- 从数据
xpath1
提取出来,并通过所传递的输入处理器的的name
字段。输入处理器的结果被收集并保存在Item Loader中(但尚未分配给该项目)。 xpath2
提取数据,并通过(1)中使用的相同输入处理器。输入处理器的结果附加到(1)中收集的数据(如果有的话)。- 这种情况类似于前面的情况,除了从
css
CSS选择器中提取数据,并通过(1)和(2)中使用的相同输入处理器。输入处理器的结果附加到(1)和(2)中收集的数据(如果有的话)。 - 这种情况也类似于以前的情况,除了直接分配要收集的值,而不是从XPath表达式或CSS选择器中提取。但是,该值仍然通过输入处理器传递。在这种情况下,由于该值不可迭代,因此在将其传递给输入处理器之前将其转换为单个元素的可迭代,因为输入处理器始终接收可迭代。
- 在步骤(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上的此答案。
评论被关闭。