Python:如何在用作参数本身的函数中使用参数?
我正在尝试做一些我不知道是否很难看的事情 我正在尝试做一些网络垃圾,我假装泛化一个函数来提取正确的类 代码是:Python:如何在用作参数本身的函数中使用参数?,python,python-3.x,beautifulsoup,Python,Python 3.x,Beautifulsoup,我正在尝试做一些我不知道是否很难看的事情 我正在尝试做一些网络垃圾,我假装泛化一个函数来提取正确的类 代码是: import requests, re from bs4 import BeautifulSoup as bs def has_label_key(tag): print(tag) return tag.has_attr("data-acc") and tag["data-acc"]=="WOTD" s
import requests, re
from bs4 import BeautifulSoup as bs
def has_label_key(tag):
print(tag)
return tag.has_attr("data-acc") and tag["data-acc"]=="WOTD"
s = requests.Session()
r = s.get("http://dle.rae.es/srv/search",data={"":"diccionario"}
bs(r.text).find_all(has_label_key)[0].id.text
我假装做的是:
def has_label_key(tag,**kwargs):
print(tag)
return tag.has_attr(kwargs["label"]) and tag[kwargs["label"]]==key
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
我看到的第一个函数和第二个函数之间的第一个区别是,例如,在第一种情况下,tag是一个bs对象,我可以在其中分割和搜索。在第二种情况下,是一个空元组
有没有办法将参数传递给函数has\u label\u key并在函数has\u attr()中使用它?在这种情况下,您将函数传递给
find\u all
:
bs(r.text).find_all(has_label_key)[0].id.text
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
但是,在第二种情况下,您尝试调用函数并将其结果传递给find\u all
:
bs(r.text).find_all(has_label_key)[0].id.text
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
(实际上调用函数不起作用,因为它缺少标记
参数。)
解决此问题的一种方法是使用lambda作为参数,这类似于定义一个新的内联函数:
bs(r.text).find_all(lambda tag: has_label_key(tag, label="data-acc",key="WOTD"}))[0].i.text
另一种方法是在中定义一个函数,该函数包含捕获外部函数参数的\u label\u key
,然后返回该内部函数:
def has_label_key(label, key):
def inner(tag):
print(tag)
return tag.has_attr(label) and tag[label]==key
return inner
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
另外,您还可以编写
返回标签。获取(标签)=键
。如果属性不存在,get
函数将返回None
,而不是引发异常。在这种情况下,将函数传递给find\u all
:
bs(r.text).find_all(has_label_key)[0].id.text
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
但是,在第二种情况下,您尝试调用函数并将其结果传递给find\u all
:
bs(r.text).find_all(has_label_key)[0].id.text
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
(实际上调用函数不起作用,因为它缺少标记
参数。)
解决此问题的一种方法是使用lambda作为参数,这类似于定义一个新的内联函数:
bs(r.text).find_all(lambda tag: has_label_key(tag, label="data-acc",key="WOTD"}))[0].i.text
另一种方法是在中定义一个函数,该函数包含捕获外部函数参数的\u label\u key
,然后返回该内部函数:
def has_label_key(label, key):
def inner(tag):
print(tag)
return tag.has_attr(label) and tag[label]==key
return inner
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
另外,您还可以编写返回标签。获取(标签)=键
。如果属性不存在,get
函数将返回None
,而不是引发异常