2013-12-18 11 views
12

के बीच आइटम पासिंग मैं एक Bookitem है मान लीजिए, मैं दोनों पार्स चरण और विस्तार चरणScrapy: तरीकों

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 

में इसे करने के लिए जानकारी जोड़ने के लिए कोड का उपयोग करना है के रूप में विस्तार से अपरिभाषित आइटम करने के लिए नेतृत्व करेंगे की जरूरत है अवस्था। मैं आइटम को विस्तार से कैसे पास कर सकता हूं? विस्तार (स्वयं, प्रतिक्रिया, वस्तु) काम नहीं लग रहा है।

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'] = .... 

उत्तर

23

एक तर्क अनुरोध के लिए meta नामित नहीं है:

4

आप विधि init में चर परिभाषित कर सकते हैं

yield Request(url, callback=self.detail, meta={'item': item}) 
तो समारोह detail में

, उपयोग यह इस तरह से:

item = response.meta['item'] 

मो देखें नौकरियों के विषय के बारे में विवरण here

+3

मुझे नहीं लगता कि यह एसिंक मोड में काम करेगा। – iMom0

संबंधित मुद्दे