2013-12-18 3 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 

Использование кода как бы привело к непредсказуемому пункта в деталях фаза. Как передать элемент деталям? детали (self, response, item), похоже, не работают.

ответ

23

Там аргумент имени meta для запроса:

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

затем в функции detail, доступ к нему таким образом:

item = response.meta['item'] 

См. Mo подробности here о теме вакансий.

4

Вы можете определить переменную в инициализации метод:

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

Я не думаю, что это будет работать в асинхронном режиме. – iMom0

Смежные вопросы