单个解析方法中的两个scrapy项目加载器?如何合并它们?

时间:2016-12-16 05:12:45

标签: python dictionary xpath scrapy generator

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

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)列表,那我怎么能使用嵌套的加载器呢?

提前感谢任何指示或建议,我有点失落:)

1 个答案:

答案 0 :(得分:4)

我认为没有办法将两个加载器实际合并为scrapy,但您可以使用从它们创建的词典:

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

    general_item.update(specific_item)

    yield general_item