:在scrapy的callback中使用lambda小结

用lambda定义函数 的用法其实很简单: lambda [参数部分]  : [函数部分]


1

先举一个简单的例子

func = lambda x,y : x+y


如果定义了这个函数之后我们执行这行命令

func(3,5)

那么显而易见结果是8。


如果我们在定义时给参数缺省值,比如

func = lambda x=3,y=5: x+y

那么调用func时

func()

结果为8

func(1,1)

结果为2


2

下面说明如何在scrapy的回调函数中使用。

比如在一个函数中要yield一个request,而回调函数除了response,我们还要一个xpath表达式。

当没有第二个参数时显然yield命令类似于这样:

yield scrapy.Request(url, callback = self.parse_mine)

现在假设我们定义的parse_mine有两个参数:

def parse_mine(self, response, xpath):
	print(response, xpath)

则在写callback时我们的目的就是要把两个参数都传递进去

所以lambda实际上结构是这样的:

lambda arg1, arg2: self.parse_mine(arg1, arg2)

也就是说我们的匿名函数的功能就是调用一下 self.parse_mine 这个类方法。

但是不能直接这样写,因为我们要告诉request命令我们的实参到底是什么,所以改成下面这样:

lambda arg1=response, arg2=xpath: self.parse_ming(arg1, arg2)

这里有一个需要注意的是,当我们callback的参数只有response,不使用lambda时,我们可以不写出response的参数。但是当我们的参数多于1时,就一定要把所有的参数都在lambda中写出来。

下面是我自己应用的一小段:

for branch_xpath, branch_url in branches:
    if response.xpath('//h3[text()="'+branch_xpath+'"]/parent::div//p[@class="seeall"]'):
        print('turn to', response.url.replace(self.index, self.detail))
        yield scrapy.Request(response.url.replace(self.index, self.detail)+'&type='+branch_url,
                             callback=lambda arg1=response, arg2=branch_xpath:self.get_branch(arg1, arg2))
    else:
        print('not many children')
        self.get_branch(response, branch_xpath)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值