:在scrapy的callback中使用lambda小结

来源:互联网 发布:遗传算法 matlab 编辑:程序博客网 时间:2024/05/22 14:05

用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)

0 0
原创粉丝点击