2012-09-08 26 views
1
from string import join 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.contrib.spiders.crawl import Rule, CrawlSpider 
from scrapy.http.request import Request 
from scrapy.selector import HtmlXPathSelector 
from Gfire.items import GfireItem 

class GuideSpider(CrawlSpider): 
    name = "Gfire" 
    allowed_domains = ['www.example.com'] 
    start_urls = [ 
     "http://www.example.com/gfire/guides" 
    ] 
    rules = (
     Rule(SgmlLinkExtractor(allow=("gfire/guides.*page=")), callback='parse_item', follow=True), 
    ) 

    def parse_item(self, response): 
     hxs = HtmlXPathSelector(response) 
     items = [] 
     sites = hxs.select('//div[@class="title"]') 
     for site in sites: 
      item = GFireItem() 
      item['title'] = site.select('./a/text()').extract() 
      item['guide_url'] = site.select('./a/@href').extract() 
      item['guide_url'] = "http://www.example.com" + join(item['guide_url']) 
      items.append(item) 
     return Request(items[1], callback=self.parse_item2) 

    def parse_item2(self, response): 
     hxs = HtmlXPathSelector(response) 
     hero = hxs.select("//h3/a/text()").extract() 
     return hero 

無法讓這個蜘蛛工作。請求函數包含項目[1],它應該是item ['guide_url'],但它表示參數必須是str或unicode。 我該如何解決這個錯誤?我怎麼能傳遞給回調函數的物品清單?通過request.meta?如何在Scrapy Spider中使用Request功能?

回答

4

您的item[1]實際上是GFireItem的一個實例。

我不確定爲什麼要創建這些,因爲您只使用一個(站點列表中的第二個站點),放棄列表的其餘部分。

這且不說,在創建Request時需要提取items[1]['guide_url']網址:

 return Request(items[1]['guide_url'], callback=self.parse_item2) 
+1

爲了只得到第二個站點,你可以使用像'hxs.select('// DIV [ @類= 「標題」] [1]')'。 –

4
def parse_item(self, response): 
    hxs = HtmlXPathSelector(response) 
    items = [] 
    sites = hxs.select('//div[@class="title"]') 
    for site in sites: 
     item = GFireItem() 
     item['title'] = site.select('./a/text()').extract() 
     item['guide_url'] = site.select('./a/@href').extract() 
     item['guide_url'] = "http://www.example.com" + join(item['guide_url']) 
     items.append(item) 
    return Request(items[1]['guide_url'], request.meta={'items':items}, callback=self.parse_item2) 

def parse_item2(self, response): 
    items = response.meta["items"] 
    hxs = HtmlXPathSelector(response) 
    hero = hxs.select("//h3/a/text()").extract() 
    return hero 
+0

也許你可以評論你的代碼與OP的不同之處。我無法通過瀏覽你的答案立即看到它:) –