爬虫蜘蛛项目加载器Item Loader类详解之声明项目加载器和输入输出处理器 (20)python SCRAPY最新教程1.51以上版本

声明项目加载器

通过使用类定义语法将Item Loaders声明为Items。这是一个例子:

from scrapy.loader import ItemLoader  from scrapy.loader.processors import TakeFirst, MapCompose, Join    class ProductLoader(ItemLoader):        default_output_processor = TakeFirst()        name_in = MapCompose(unicode.title)      name_out = Join()        price_in = MapCompose(unicode.strip)        # ...

 

如您所见,输入处理器使用_in后缀声明,而输出处理器使用_out后缀声明。您还可以使用ItemLoader.default_input_processor和 ItemLoader.default_output_processor属性声明默认的输入/输出处理器 。

声明输入和输出处理器

如上一节所示,输入和输出处理器可以在Item Loader定义中声明,以这种方式声明输入处理器是很常见的。但是,还有一个地方可以指定要使用的输入和输出处理器:在项目字段 元数据中。这是一个例子:

import scrapy  from scrapy.loader.processors import Join, MapCompose, TakeFirst  from w3lib.html import remove_tags    def filter_price(value):      if value.isdigit():          return value    class Product(scrapy.Item):      name = scrapy.Field(          input_processor=MapCompose(remove_tags),          output_processor=Join(),      )      price = scrapy.Field(          input_processor=MapCompose(remove_tags, filter_price),          output_processor=TakeFirst(),      )  >>> from scrapy.loader import ItemLoader  >>> il = ItemLoader(item=Product())  >>> il.add_value('name', [u'Welcome to my', u'<strong>website</strong>'])  >>> il.add_value('price', [u'&euro;', u'<span>1000</span>'])  >>> il.load_item()  {'name': u'Welcome to my website', 'price': u'1000'}

 

输入和输出处理器的优先顺序如下:

  1. Item Loader特定于字段的属性:field_infield_out(最优先)
  2. 字段元数据(input_processoroutput_processor键)
  3. Item Loader默认值:ItemLoader.default_input_processor()ItemLoader.default_output_processor()(最少优先级)

另请参阅:重用和扩展项目加载器。

项目加载器上下文

Item Loader Context是任意键/值的dict,它在Item Loader中的所有输入和输出处理器之间共享。它可以在声明,实例化或使用Item Loader时传递。它们用于修改输入/输出处理器的行为。

例如,假设您有一个函数parse_length接收文本值并从中提取长度:

def parse_length(text, loader_context):      unit = loader_context.get('unit', 'm')      # ... length parsing code goes here ...      return parsed_length

 

通过接受loader_context参数,函数显式地告诉Item Loader它能够接收Item Loader上下文,因此Item Loader在调用它时传递当前活动的上下文,并且处理器函数(parse_length在这种情况下)可以使用它们。

有几种方法可以修改Item Loader上下文值:

  1. 通过修改当前活动的Item Loader上下文(context属性):

    loader = ItemLoader(product)  loader.context['unit'] = 'cm'

     

  2. 在Item Loader实例化中(Item Loader构造函数的关键字参数存储在Item Loader上下文中):

    loader = ItemLoader(product, unit='cm')

     

  3. 在Item Loader声明中,对于那些支持使用Item Loader上下文实例化它们的输入/输出处理器。MapCompose是其中之一:

    class ProductLoader(ItemLoader):      length_out = MapCompose(parse_length, unit='cm')

     

本文目录导航

  • 声明项目加载器
  • 声明输入和输出处理器
  • 项目加载器上下文
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。