我开始使用此代码:
import bs4, requests
def bal(address, symbol, name):
r = requests.get('https://bitinfocharts.com/' + name + '/address/' + address)
soup = bs4.BeautifulSoup(r.text, 'html.parser')
elems = soup.find('div', itemprop = 'offers').contents[0].text
elems = elems.replace(symbol,'').strip()
return(elems)
print(bal('3D2oetdNuZUqQHPJmcMDDHYoqkyNVsFk9r', 'BTC', 'Bitcoin'))
print(bal('LQL9pVH1LsMfKwt82Y2wGhNGkrjF8vwUst', 'LTC', 'Litecoin'))
哪个有效并产生:
174,631.39464194
897,135.38526651
但是,此函数需要在大量字典中运行,因此我尝试修改代码并将数据放在字典中,然后将字典列表作为函数参数传递。
import bs4, requests
wallet1 = {
'address' : '3D2oetdNuZUqQHPJmcMDDHYoqkyNVsFk9r',
'symbol' : 'BTC',
'name' : 'Bitcoin',
}
wallet2 = {
'address' : 'LQL9pVH1LsMfKwt82Y2wGhNGkrjF8vwUst',
'symbol' : 'LTC',
'name' : 'Litecoin',
}
wallets = [wallet1, wallet2]
def bal(address, symbol, name):
r = requests.get('https://bitinfocharts.com/' + name + '/address/' + address)
soup = bs4.BeautifulSoup(r.text, 'html.parser')
elems = soup.find('div', itemprop = 'offers').contents[0].text
elems = elems.replace(symbol,'').strip()
return(elems)
print(bal(wallets))
我收到以下错误消息:
Traceback (most recent call last):
File "/Users/tfountain/Desktop/python_work/stack.py", line 46, in <module>
print(bal(wallets))
TypeError: bal() missing 2 required positional arguments: 'symbol' and 'name'
>>>
我到底哪里错了?
如何使用字典列表作为函数参数?
答案 0 :(得分:1)
功能&#39; bal&#39;期望采取3个论点。
你用一个参数调用bal,因此它抱怨它缺少2(3 - 1 = 2)。
你需要修改你的bal函数,因此它只能采用一个参数,例如。
def bal(wallets):
并通过例如从传递的参数中提取钱包字典迭代它:
for w in wallets
现在您可以从'address, symbol, name'
dict访问w
,例如:
address = w['address']
symbol = w['sumbol']
name = w['name']
这是适合您的代码:
def bal(wallets):
elems_all = []
for w in wallets:
address = w['address']
symbol = w['symbol']
name = w['name']
r = requests.get('https://bitinfocharts.com/' + name + '/address/' + address)
soup = bs4.BeautifulSoup(r.text, 'html.parser')
elems = soup.find('div', itemprop = 'offers').contents[0].text
elems = elems.replace(symbol,'').strip()
elems_all.append([elems, w])
return elems_all
这是非常基本的实现,但它适合您。你可能想修改它以使用更漂亮的Python实现。
您可以通过访问elems_all元组列表来访问带钱包的正确元素。
答案 1 :(得分:0)
TL; DR
for w in wallets:
print(bal(**w))
解决方案需要理解两个不同的概念,循环和参数解包
你不能打电话
bal(wallets)
因为那是调用不存在的函数bal(<list>)
...(你的函数有三个args,而不是一个)。由于您的bal
功能需要一个钱包,我们只需为您列表中的每个钱包拨打一次。
你的功能仍然期待三个args,所以我们不能只传递w
,因为它是一个字典。您可以使用一些python语法糖来自动从字典中提取值,并将它们作为命名参数传递给函数。因此bal(**w)
的行为将为bal(address=<the value of address>, symbol=<val...>, name=<val...>)
。
使用这种方法要记住的一件事是参数解包会将dict中的 ALL 键/值传递给函数,因此如果你添加了一些意想不到的东西,你就会收到错误。