2016-12-16 25 views
0

我正在解析一个页面,但id喜欢把它分成几个部分,页面上有多个会议的信息。一些信息对所有会议都很常见,但并非全部。所以我做了一个项目加载器的一般信息和一个具体的信息。不过,我希望这个解析器返回与会议有关的所有信息(即:一般的和特定的)。这里是我的代码的解析方法:单个解析方法中的两个scrapy项目加载器?如何合并它们?

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。

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

这里就是我坚持:

  • 更新方法不工作的load_item,我似乎无法这两件事情合并。
  • 显然我不能在加载器响应中使用response.xpath()(我正在使用会议)元素?
  • 最后,必须有更好的方法来实现这一点,我试过嵌套装载机,他们似乎很有前途,但会见变化。它遍历response.xpath(self.meeting_xpath)列表,所以我如何使用嵌套的加载器?

预先感谢任何指针或建议,我有点失去:)

回答

4

我不认为有实际合并两个装载机到scrapy的方式,但你可以使用创建的字典从他们:

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

    general_item.update(specific_item) 

    yield general_item 
+0

这是行不通的。这正是我试图用最后一行代码所做的。任何其他想法? –

+0

为什么它不工作?你在代码中没有做同样的事情,你不能返回(或产生)'dict.update()',因为'update'不会返回一个字典,它只会更新当前对象。 – eLRuLL

+0

Ohhhhhh我不知道'更新'改变了字典。谢谢@eLRuLL –