2013-09-25 44 views
1

我有一个项目将填充每个解析函数。我想在解析完成后返回更新的项目。这是我的情景:修改多个解析函数中的项目并返回更新的项目?

我的项目类:

class MyItem(Item): 

    name = Field() 
    links1 = Field() 
    links2 = Field() 

我有多个网址,登录后抓取:

在解析功能

,我这样做:

for url in urls: 
    yield Request(url=url, callback=self.get_info) 

在get_info,我将在每个响应中提取“名称”和“链接”:

item = MyItem() 
item['name'] = hxs.select("//title/text()").extract() 
links = [] 
link = {} 
for data in json_parsed_from_response: 
    link['name'] = data.get('name') 
    link['url'] = data.get('url') 
    links.append(link) 
item['links1] = links 

#similarly, item['links2'] is created. 

现在,我想通过每个网址的每个项目[“links1]和项目[” links2' ]作为(这些循环是内部的get_info):

for link in item['links1']: 
    request = Request(url= link['url'], callback=self.get_status) 
    request.meta['link'] = link 
    yield request 

for link in item['links2']: 
    request = Request(url= link['url'], callback=self.get_status) 
    request.meta['link'] = link 
    yield request 

# Where do I return item, can't return item inside generator 

def get_status(self, response): 

    link = response.meta['link'] 
    if "good" in response.body: 
     link['status'] = 'good' 
    else: 
     link['status'] = 'bad' 

    # Changes made here, will be reflected in item? 
    # Also, I can't return item from here. Multiple items will be returned. 

我不能找出item必须返回的位置,它应该包含所有更新的数据。

+0

你在哪里创建“项目”本身?你在哪里创建“MyItem”?你能显示整个代码吗? –

+0

它在get_info中。对不起,不能发布代码,其大。我已经发布确切的情况。 – rajpy

回答

0

对不起,但除非你提供一些更多的细节,我无法理解你的代码的设计,因此我不能帮助...我最好的建议是创建一个* MyItem的列表 * s并将您创建的每个项目追加到该列表中。这些值应该随着你的改变而改变。所以你应该可以遍历列表并查看更新的项目。

+0

没有MyItem的列表,只有MyItem的一个实例。另外,正如你所说的,我认为item的字段应该从任何解析函数中更新,因为我们通过引用。让我们认为它正确更新,但应该返回哪个函数项?我已在每项功能中写下评论,请检查。最后,我应该只拿到所有数据。感谢您的关注。 – rajpy

+0

你在哪里创建这个MyItem实例?最后检查这个实例。你可能不需要返回。 –

+0

它创建了get_info,更新了问题。而且,我必须返回它,否则json将不会被创建。 – rajpy