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
好吧,我在主解析方法中抓取整个表格,并从该表格中取出了几个字段。其中一个字段是一个网址,我想探索它以获得一堆新的字段。如何将已创建的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
答案 0 :(得分:30)
这是您使用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
的便捷捷径。
答案 1 :(得分:7)
这是将args传递给回调函数的更好方法:
def parse(self, response):
request = scrapy.Request('http://www.example.com/index.html',
callback=self.parse_page2,
cb_kwargs=dict(main_url=response.url))
request.cb_kwargs['foo'] = 'bar' # add more arguments for the callback
yield request
def parse_page2(self, response, main_url, foo):
yield dict(
main_url=main_url,
other_url=response.url,
foo=foo,
)
答案 2 :(得分:0)
我在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)
答案 3 :(得分:0)
由于v1.7是kwargs
,因此是将Request
传递到cb_kwargs
回调的首选方式。在此之前,元数据还没有到。
这是来自Scrapy文档的示例:
def parse(self, response):
request = scrapy.Request('http://www.example.com/index.html',
callback=self.parse_page2,
cb_kwargs=dict(main_url=response.url))
request.cb_kwargs['foo'] = 'bar' # add more arguments for the callback
yield request
def parse_page2(self, response, main_url, foo):
yield dict(
main_url=main_url,
other_url=response.url,
foo=foo,
)
Link to Scrapy docs了解更多信息。
答案 4 :(得分:0)
@peduDev
尝试了您的方法,但由于关键字意外而导致某些操作失败。
scrapy_req = scrapy.Request(url=url,
callback=self.parseDetailPage,
cb_kwargs=dict(participant_id=nParticipantId))
def parseDetailPage(self, response, participant_id ):
.. Some code here..
yield MyParseResult (
.. some code here ..
participant_id = participant_id
)
Error reported
, cb_kwargs=dict(participant_id=nParticipantId)
TypeError: _init_() got an unexpected keyword argument 'cb_kwargs'
除了旧版本外,是什么原因导致了意外的关键字参数?
是的。我核实了自己的建议,升级后,一切都按怀疑的方式进行了。
sudo pip install --upgrade scrapy