【问题标题】:Two scrapy item loaders in a single parse method? how to merge them?单个解析方法中的两个scrapy项目加载器?如何合并它们?
【发布时间】:2016-12-16 05:12:45
【问题描述】:

我正在解析一个页面,但我喜欢将其划分为多个部分,该页面包含有关多个会议的信息。某些信息对所有会议都是通用的,但并非所有信息。所以我为一般信息和特定信息制作了一个项目加载器。但是,我希望此解析器返回与会议有关的所有信息(即:一般信息和特定信息)。这是我的代码的解析方法:

def parse(self, response):

    general_loader = ItemLoader(item=ProductItem(), response=response)
    general_loader.default_input_processor = MapCompose(unicode.strip)
    general_loader.default_output_processor = Join("  &  ")

    for field, xpath in self.general_item_fields.iteritems():
        general_loader.add_xpath(field, xpath)

    for meeting in response.xpath(self.meeting_xpath):
        specific_loader = ItemLoader(item=ProductItem(), response=meeting)
        specific_loader.default_input_processor = MapCompose(unicode.strip)
        specific_loader.default_output_processor = Join("  &  ")

        for field, xpath in self.specific_item_fields.iteritems():
            specific_loader.add_xpath(field, xpath)
        yield general_loader.load_item().update(specific_loader.load_item())

变量specific_item_fields和general_item_fields是带有会议属性的字典,是xpath。

所以我在这里尝试做的是使用会议作为我称为 specific_loader 的第二个 ItemLoader 的响应。由于 general_loader.load_item() 似乎返回了一个字典,我尝试将它与 specific_loader.load_item() 字典更新或合并。

这就是我卡住的地方:

  • 更新方法对 load_item 不起作用,我似乎无法合并这两件事。
  • 显然我不能使用 response.xpath() (我在这里使用会议)元素作为加载程序响应?
  • 最后必须有更好的方法来实现这一点,我尝试了嵌套加载器,它们看起来很有希望,但会遇到变化。它在 response.xpath(self.meeting_xpath) 列表中循环,所以我如何使用嵌套加载器?

提前感谢您的任何指示或建议,我有点迷路了:)

【问题讨论】:

    标签: python dictionary xpath scrapy generator


    【解决方案1】:

    我认为没有办法将两个加载器真正合并到scrapy中,但你可以使用从它们创建的字典:

        ...
        general_item = general_loader.load_item()
        specific_item = specific_loader.load_item()
    
        general_item.update(specific_item)
    
        yield general_item
    

    【讨论】:

    • 这不起作用。这就是我试图用最后一行代码做的事情。还有其他想法吗?
    • 为什么它不能工作?你在代码中没有做同样的事情,你不能返回(或产生)dict.update(),因为update 不返回字典,它只更新当前对象。
    • Ohhhhhh 我不知道“更新”更改了字典。谢谢@eLRuLL
    • 我很高兴@MaxSmith
    猜你喜欢
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2022-07-23
    相关资源
    最近更新 更多