2013-12-18 17 views
12

Załóżmy, że mam Bookitem, muszę dodać informację do niego zarówno w parsowania faz i szczegółowo fazyScrapy: Przechodząc pozycję między metodami

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 

Używając kodu, jak to będzie prowadziło do niezdefiniowanej pozycji w szczegółach faza. Jak mogę przekazać przedmiot do szczegółów? szczegół (self, response, item) wydaje się nie działać.

Odpowiedz

23

istnieje argument o nazwie meta na żądanie:

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

następnie w funkcji detail, dostęp to w ten sposób:

item = response.meta['item'] 

Zobacz mo ponownie szczegóły here o temacie pracy.

4

Można zdefiniować zmienną w init, metody:

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

Nie sądzę, że to zadziała w trybie asynchronicznym. – iMom0