爬虫蜘蛛项目加载器Item Loader类详解之可用的内置处理器详解 (24)python SCRAPY最新教程1.51以上版本
尽管您可以使用任何可调用函数作为输入和输出处理器,但Scrapy提供了一些常用的处理器,如下所述。其中一些MapCompose
(如通常用作输入处理器)组成了按顺序执行的几个函数的输出,以产生最终的解析值。
以下是所有内置处理器的列表:
- class
scrapy.loader.processors.
Identity
- 最简单的处理器,它什么都不做。它返回原始值不变。它不接收任何构造函数参数,也不接受Loader上下文。
例:
>>> from scrapy.loader.processors import Identity >>> proc = Identity() >>> proc(['one', 'two', 'three']) ['one', 'two', 'three']
- class
scrapy.loader.processors.
TakeFirst
- 从接收的值返回第一个非null /非空值,因此它通常用作单值字段的输出处理器。它不接收任何构造函数参数,也不接受Loader上下文。
例:
>>> from scrapy.loader.processors import TakeFirst >>> proc = TakeFirst() >>> proc(['', 'one', 'two', 'three']) 'one'
- class
scrapy.loader.processors.
Join
(separator = u” ) - 返回与构造函数中给定的分隔符连接的值,默认为。它不接受Loader上下文。
u' '
使用默认分隔符时,此处理器等效于以下功能:
u' '.join
例子:
>>> from scrapy.loader.processors import Join >>> proc = Join() >>> proc(['one', 'two', 'three']) u'one two three' >>> proc = Join('<br>') >>> proc(['one', 'two', 'three']) u'one<br>two<br>three'
- class
scrapy.loader.processors.
Compose
(* functions,** default_loader_context ) - 一种处理器,它由给定功能的组合构成。这意味着该处理器的每个输入值都被传递给第一个函数,并且该函数的结果被传递给第二个函数,依此类推,直到最后一个函数返回该处理器的输出值。
默认情况下,停止处理
None
值。可以通过传递关键字参数来更改此行为stop_on_none=False
。例:
>>> from scrapy.loader.processors import Compose >>> proc = Compose(lambda v: v[0], str.upper) >>> proc(['hello', 'world']) 'HELLO'
每个函数都可以选择接收
loader_context
参数。对于那些处理器,该处理器将通过该参数传递当前活动的Loader上下文。在构造函数中传递的关键字参数用作传递给每个函数调用的默认Loader上下文值。但是,传递给函数的最终Loader上下文值将被当前活动的Loader上下文覆盖,该上下文可通过该
ItemLoader.context()
属性访问。
- class
scrapy.loader.processors.
MapCompose
(* functions,** default_loader_context ) - 一种处理器,它由给定功能的组合构成,类似于
Compose
处理器。与此处理器的不同之处在于内部结果在函数之间传递的方式,如下所示:迭代该处理器的输入值,并将第一个函数应用于每个元素。这些函数调用的结果(每个元素一个)被连接起来构造一个新的iterable,然后用于应用第二个函数,依此类推,直到最后一个函数应用于所收集的值列表的每个值,远。最后一个函数的输出值连接在一起以产生该处理器的输出。
每个特定函数都可以返回值或值列表,这些值使用应用于其他输入值的同一函数返回的值列表进行展平。函数也可以返回,
None
在这种情况下,忽略该函数的输出以进行链上的进一步处理。此处理器提供了一种方便的方法来组合仅使用单个值(而不是迭代)的函数。由于这个原因,
MapCompose
处理器通常用作输入处理器,因为数据通常使用选择器的extract()
方法提取,选择器的 方法返回unicode字符串列表。以下示例应阐明其工作原理:
>>> def filter_world(x): ... return None if x == 'world' else x ... >>> from scrapy.loader.processors import MapCompose >>> proc = MapCompose(filter_world, unicode.upper) >>> proc([u'hello', u'world', u'this', u'is', u'scrapy']) [u'HELLO, u'THIS', u'IS', u'SCRAPY']
与Compose处理器一样,函数可以接收Loader上下文,构造函数关键字参数用作默认上下文值。请参阅
Compose
处理器了解更多信息
- class
scrapy.loader.processors.
SelectJmes
(json_path ) - 使用提供给构造函数的json路径查询值并返回输出。需要jmespath(https://github.com/jmespath/jmespath.py)才能运行。该处理器一次只能输入一个输入。
例:
>>> from scrapy.loader.processors import SelectJmes, Compose, MapCompose >>> proc = SelectJmes("foo") #for direct use on lists and dictionaries >>> proc({'foo': 'bar'}) 'bar' >>> proc({'foo': {'bar': 'baz'}}) {'bar': 'baz'}
与Json合作:
>>> import json >>> proc_single_json_str = Compose(json.loads, SelectJmes("foo")) >>> proc_single_json_str('{"foo": "bar"}') u'bar' >>> proc_json_list = Compose(json.loads, MapCompose(SelectJmes('foo'))) >>> proc_json_list('[{"foo":"bar"}, {"baz":"tar"}]') [u'bar']
评论被关闭。