2012-12-12 42 views
4

我有這段代碼。當我使用yyield要求futher鏈接,然後我得到這個errror在scrapy python中獲取錯誤與收益

Spider must return Request, BaseItem or None, got 'dict' 

我試圖verything但我無法擺脫錯誤

代碼是在這裏

def parse_items(self, response): 
    hxs = HtmlXPathSelector(response) 
    sites = hxs.select("//li[contains(concat(' ', @class, ' '), ' mod-searchresult-entry ')]") 
    items = [] 


    for site in sites[:2]: 

     item = SeekItem() 
     item['title'] = myfilter(site.select('dl/dd/h2/a').select("string()").extract()) 
     item['link_url'] = myfilter(site.select('dl/dd/h2/em').select("string()").extract()) 
     item['description'] = myfilter(site.select('dl/dd/p').select("string()").extract()) 
     if item['link_url']: 
         yield Request(urljoin('http://www.seek.com.au/', item['link_url']), 
         meta = item, 
         callback = self.parseItemDescription) 

     yield item 

def parseItemDescription(self, response): 

    item = response.meta 
    hxs = HtmlXPathSelector(response) 
    sites = hxs.select("//li[contains(concat(' ', @class, ' '), ' mod-searchresult-entry ')]") 
    item['description'] = "mytest" 

    return item 

回答

4

您正在使用哪種scrapy版本。 0.16.2的文檔有這種方法passing items to another callback

def parse_items(self, response): 
    hxs = HtmlXPathSelector(response) 
    sites = hxs.select("//li[contains(concat(' ', @class, ' '), ' mod-searchresult-entry ')]") 
    items = [] 

    for site in sites[:2]: 
     item = SeekItem() 
     item['title'] = myfilter(site.select('dl/dd/h2/a').select("string()").extract()) 
     item['link_url'] = myfilter(site.select('dl/dd/h2/em').select("string()").extract()) 
     item['description'] = myfilter(site.select('dl/dd/p').select("string()").extract()) 
     if item['link_url']: 
      request = Request("http://www.example.com/some_page.html", callback=self.parseItemDescription) 
      request.meta['item'] = item 
      return request 

def parseItemDescription(self, response): 

    item = response.meta['item'] 
    hxs = HtmlXPathSelector(response) 
    sites = hxs.select("//li[contains(concat(' ', @class, ' '), ' mod-searchresult-entry ')]") 
    item['description'] = "mytest" 

    return item 

注:這是未經測試的代碼的其餘部分(蜘蛛,items.py等)失蹤,我不知道這是怎麼回事正在運行

+0

謝謝哥們,那完美的工作 – user1896360

3

兩個收益率

您正在屈服兩次 - 第一次是請求;第二個是dic。 (產量請求(...)產量項

我猜第二次是沒有必要的,應予刪除。嘗試下面的評論和評論。 (刪除產品項目

+0

此外,有什麼用額外的括號回事_self.parseItemDescription_之後? – Shariq

+0

好的。當我刪除'yield item'時,它不起作用,但是當我刪除第二個'return item'時,它就起作用了。但是我的描述沒有被插入到項目中。第二個括號是Request()並且工作正常 – user1896360

+0

您是否打算在某些響應中調用_parseItemDescription_?你有_self.parseItemDescription_,沒有任何括號可以調用函數 - 你爲什麼要這麼做? – Shariq