尽管您可以使用任何可调用函数作为输入和输出处理器,但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'

 

classscrapy.loader.processors.Joinseparator = 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'

 

classscrapy.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() 属性访问。

classscrapy.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处理器了解更多信息

classscrapy.loader.processors.SelectJmesjson_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']

评论被关闭。