2013-12-18 6 views
12

Angenommen, ich habe eine Bookitem, ich Informationen, um es sowohl in der Parse-Phase und Detail PhaseScrapy: Passing Punkt zwischen Methoden

def parse(self, response) 
    data = json.loads(response) 
    for book in data['result']: 
     item = BookItem(); 
     item['id'] = book['id'] 
     url = book['url'] 
     yield Request(url, callback=self.detail) 

def detail(self,response):   
    hxs = HtmlXPathSelector(response) 
    item['price'] = ...... 
#I want to continue the same book item as from the for loop above 

Mit dem Code hinzufügen muß wie im Detail zu undefiniertem Punkt geführt hätte Phase. Wie kann ich den Artikel an das Detail weitergeben? Detail (Selbst, Antwort, Element) scheint nicht zu funktionieren.

Antwort

23

Es Argument meta für Antrag benannt ist

item = response.meta['item'] 

Siehe mo Zur Details here über Jobs Thema.

4

Sie können variabel in init Methode definieren:

yield Request(url, callback=self.detail, meta={'item': item}) 

dann in Funktion detail, Zugriff es auf diese Weise:

class MySpider(BaseSpider): 
    ... 

    def __init__(self): 
     self.item = None 

    def parse(self, response) 
     data = json.loads(response) 
     for book in data['result']: 
      self.item = BookItem(); 
      self.item['id'] = book['id'] 
      url = book['url'] 
      yield Request(url, callback=self.detail) 

    def detail(self, response):   
     hxs = HtmlXPathSelector(response) 
     self.item['price'] = .... 
+3

Ich glaube nicht, dass dies im asynchronen Modus funktioniert. – iMom0