2013-12-18 12 views
12

arasındaki öğeyi geçerken ben ayrıntılı olarak tanımlanmamış öğeye açtı olurdu olduğu gibi kodu kullanarak ayrıştırma fazı ve detay fazıscrapy: yöntemlerle

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 

hem kendisine bilgi eklemek gerekir, bir Bookitem olduğunu varsayalım faz. Öğeyi detaylara nasıl aktarabilirim? detay (öz, cevap, madde) işe yaramıyor. Bir İsteği meta adlı argüman yoktur

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

cevap

4

Sen init yöntemi değişken tanımlayabilirsiniz fonksiyonu detail sonra

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

, erişim bu şekilde:

item = response.meta['item'] 

mo bakın iş konuları hakkında here ayrıntılarını yeniden.

+3

Bunun asenkron modda çalışacağını düşünmüyorum. – iMom0