爬虫蜘蛛项目加载器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', xpath4) # (1) l.add_xpath('name', xpath5) # (2) l.add_css('name', css) # (3) l.add_value('name', 'test') # (4) return l.load_item() # (5)
那么会发生什么:
- 从数据
xpath4
提取出来,并通过所传递的输入处理器的的name
字段。输入处理器的结果被收集并保存在Item Loader中(但尚未分配给该项目)。 xpath5
提取数据,并通过(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上的此答案。
您需要记住的另一件事是输入处理器返回的值在内部收集(在列表中),然后传递给输出处理器以填充字段。
最后,但并非最不重要的是,为了方便起见,Scrapy 内置了一些常用的处理器。
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。