2012-09-08 5 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 

거미가 작동하지 않습니다. 요청 함수는 항목 [ 'guide_url']이어야하는 항목 [1]을 포함하지만 매개 변수가 str 또는 unicode 여야한다고 나에게 말합니다. 어떻게이 오류를 해결할 수 있습니까? 그리고 아이템 목록에 콜백 함수를 어떻게 전달할 수 있습니까? request.meta를 통해?Scrapy Spider에서 Request 기능을 사용하는 방법?

답변

4

item[1]은 실제로 GFireItem의 인스턴스입니다.

하나의 (사이트 목록의 두 번째 사이트) 만 사용하므로 나머지 목록은 삭제되므로 이러한 내용을 만드는 이유가 확실하지 않습니다.

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

, 당신은 hxs.select'같은 것을 사용할 수 있습니다에만 두 번째 사이트를 얻으려면 ('// DIV의 [다음 Request를 만들 때 옆으로, 당신은 items[1]['guide_url'] URL을 추출해야

@ class = "title"] [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와 다르게 설명 할 수 있습니다. 난 당신의 대답을 감추고 즉시 그것을 볼 수 없었다 :) –

관련 문제