![](/img/trans.png)
[英]How can I write a python function to accept *arguments and a keyword argument?
[英]Python: How can I use arguments in a function used as argument itself?
我正在嘗試做一些我不知道它是否非常丑陋的事情......
我正在嘗試做一些網絡抓取,並假裝概括一個函數來提取正確的類。
代碼是:
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_label_key並在函數has_attr() 中使用它?
在這種情況下,您將一個函數傳遞給find_all
:
bs(r.text).find_all(has_label_key)[0].id.text
但是,在第二種情況下,您嘗試調用該函數並將其結果傳遞給find_all
:
bs(r.text).find_all(has_label_key(label="data-acc",key="WOTD"}))[0].i.text
(實際上調用該函數不起作用,因為它缺少tag
參數。)
修復它的一種方法是使用 lambda 作為參數,這就像定義一個新的內聯函數:
bs(r.text).find_all(lambda tag: has_label_key(tag, label="data-acc",key="WOTD"}))[0].i.text
另一種方法是在has_label_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
PS 你也可以寫return tag.get(label) == key
。 如果屬性不存在, get
函數將返回None
,而不是引發異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.