Передача аргумента функции обратного вызова

def parse(self, response):
    for sel in response.xpath('//tbody/tr'):
        item = HeroItem()
        item['hclass'] = response.request.url.split("/")[8].split('-')[-1]
        item['server'] = response.request.url.split('/')[2].split('.')[0]
        item['hardcore'] = len(response.request.url.split("/")[8].split('-')) == 3
        item['seasonal'] = response.request.url.split("/")[6] == 'season'
        item['rank'] = sel.xpath('td[@class="cell-Rank"]/text()').extract()[0].strip()
        item['battle_tag'] = sel.xpath('td[@class="cell-BattleTag"]//a/text()').extract()[1].strip()
        item['grift'] = sel.xpath('td[@class="cell-RiftLevel"]/text()').extract()[0].strip()
        item['time'] = sel.xpath('td[@class="cell-RiftTime"]/text()').extract()[0].strip()
        item['date'] = sel.xpath('td[@class="cell-RiftTime"]/text()').extract()[0].strip()
        url = 'https://' + item['server'] + '.battle.net/' + sel.xpath('td[@class="cell-BattleTag"]//a/@href').extract()[0].strip()

        yield Request(url, callback=self.parse_profile)

def parse_profile(self, response):
    sel = Selector(response)
    item = HeroItem()
    item['weapon'] = sel.xpath('//li[@class="slot-mainHand"]/a[@class="slot-link"]/@href').extract()[0].split('/')[4]
    return item

Ну, я очищаю целую таблицу в основном методе синтаксического анализа, и я взял несколько полей из этой таблицы. Одним из этих полей является URL-адрес, и я хочу изучить его, чтобы получить целую новую группу полей. Как передать мой уже созданный объект ITEM функции обратного вызова, чтобы последний элемент сохранял все поля?

Как показано в приведенном выше коде, я могу сохранить поля внутри url (код на данный момент) или только те, что указаны в таблице (просто напишите yield item) но я не могу дать только один объект со всеми полями вместе.

Я пробовал это, но, очевидно, это не работает.

yield Request(url, callback=self.parse_profile(item))

def parse_profile(self, response, item):
    sel = Selector(response)
    item['weapon'] = sel.xpath('//li[@class="slot-mainHand"]/a[@class="slot-link"]/@href').extract()[0].split('/')[4]
    return item

Ответ 1

Это то, что вы использовали бы ключевое слово meta для.

def parse(self, response):
    for sel in response.xpath('//tbody/tr'):
        item = HeroItem()
        # Item assignment here
        url = 'https://' + item['server'] + '.battle.net/' + sel.xpath('td[@class="cell-BattleTag"]//a/@href').extract()[0].strip()

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

def parse_profile(self, response):
    item = response.meta.get('hero_item')
    item['weapon'] = response.xpath('//li[@class="slot-mainHand"]/a[@class="slot-link"]/@href').extract()[0].split('/')[4]
    yield item

Также обратите внимание: выполнение sel = Selector(response) является пустой тратой ресурсов и отличается от того, что вы делали ранее, поэтому я изменил его. Он автоматически отображается в response как response.selector, который также имеет удобный ярлык response.xpath.

Ответ 2

У меня была аналогичная проблема с передачей дополнительных аргументов Tkinter и нашлось это решение для работы (здесь: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/extra-args.html), преобразованный в ваш проблема:

def parse(self, response):
    item = HeroItem()
    [...]
    def handler(self = self, response = response, item = item):
        """ passing as default argument values """
        return self.parse_profile(response, item)
    yield Request(url, callback=handler)