笨鸟编程-零基础入门Pyhton教程

 找回密码
 立即注册

项目加载器

发布者: 笨鸟自学网



项目加载器上下文

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

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

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

接受一个 loader_context 参数函数显式地告诉项目加载器它能够接收项目加载器上下文,因此项目加载器在调用它时传递当前活动的上下文,以及处理器函数 (parse_length 在这种情况下)可以使用它们。

修改项目加载器上下文值有几种方法:

  1. 通过修改当前活动的项加载器上下文 (context 属性):

    loader = ItemLoader(product)
    loader.context['unit'] = 'cm'
    
  2. 项目加载器实例化(项目加载器的关键字参数 __init__ 方法存储在项加载器上下文中)::

    loader = ItemLoader(product, unit='cm')
    
  3. 在项目加载器声明中,用于那些支持用项目加载器上下文实例化它们的输入/输出处理器。 MapCompose 是其中之一:

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

项加载器对象

嵌套装载机

从文档的子部分分析相关值时,创建嵌套加载器可能很有用。假设您正在从一个页面的页脚提取细节,该页面的外观如下:

例子::

<footer>
    <a class="social" href="https://facebook.com/whatever">Like Us</a>
    <a class="social" href="https://twitter.com/whatever">Follow Us</a>
    <a class="email" href="mailto:whatever@example.com">Email Us</a>
</footer>

如果没有嵌套加载程序,则需要为要提取的每个值指定完整的xpath(或css)。

例子::

loader = ItemLoader(item=Item())
# load stuff not in the footer
loader.add_xpath('social', '//footer/a[@class = "social"]/@href')
loader.add_xpath('email', '//footer/a[@class = "email"]/@href')
loader.load_item()

相反,您可以使用页脚选择器创建嵌套加载程序,并添加相对于页脚的值。功能相同,但避免重复页脚选择器。

例子::

loader = ItemLoader(item=Item())
# load stuff not in the footer
footer_loader = loader.nested_xpath('//footer')
footer_loader.add_xpath('social', 'a[@class = "social"]/@href')
footer_loader.add_xpath('email', 'a[@class = "email"]/@href')
# no need to call footer_loader.load_item()
loader.load_item()

您可以任意嵌套加载程序,它们可以使用xpath或css选择器。作为一般准则,当嵌套加载器使您的代码更简单,但不要过度嵌套,否则您的解析器可能会变得难以读取。


上一篇:项目下一篇:Scrapy shell

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2024-11-23 16:25 , Processed in 0.033011 second(s), 17 queries .

© 2001-2020

返回顶部