2013-09-25 47 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