Eu sou bastante novo em python e é meu primeiro post aqui no Stack, então uma apologia se meu post não estiver bem formatado. Estou tentando preencher um dicionário usando dados extraídos de um site da web, eu obtenho os dados, então os atribuo ao dicionário, quando imprimo o dicionário os dados aparecem. Não consegui acessar apenas uma linha do dicionário, o que estou perdendo?
Aqui está o código:
import requests
from bs4 import BeautifulSoup
print('{:<10} {:<30}'.format('Tiker', 'Price'))
print()
url = 'https://www.coingecko.com/en'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
coin_table = soup.find('div', class_ = 'coingecko-table')
sym = []
price = []
for coin in coin_table.find_all('tbody'):
rows = coin.find_all('tr')
for row in rows:
token_sym = row.find('span', class_ = 'tw-hidden d-lg-inline font-normal text-3xs ml-2').text.strip()
token_price = row.find('span', {'data-target' : 'price.price'}).text.strip()
sym.append(token_sym)
price.append(token_price)
print('{:<10} {:<30}'.format((token_sym),(token_price)))
data = dict(zip(sym,price))
print(data)
Aqui está o resultado:
Tiker Price
BTC $44,124
ETH $3,008.67
USDT $1.00
BNB $375.26
ADA $1.70
XRP $0.942681
DOGE $0.255957
USDC $1.00
DOT $20.18
UNI $27.07
BUSD $1.00
SOL $40.00
BCH $598.93
LTC $163.80
LINK $24.36
WBTC $44,081
ICP $62.06
MATIC $1.28
ETC $58.58
XLM $0.319697
VET $0.104720
THETA $6.64
LUNA $16.00
FIL $67.32
OKB $22.29
TRX $0.081499304270
DAI $1.00
FTT $48.11
CUSDC $0.022222942221
AAVE $381.38
XMR $258.06
CETH $60.28
CDAI $0.021684507697
EOS $4.60
CAKE $18.80
AXS $69.08
ATOM $13.65
GRT $0.793827
SHIB $0.000007551040
KLAY $1.43
CRO $0.138263
NEO $46.96
BTT $0.004398147292
AMP $0.060216111886
MKR $3,200.18
BSV $152.82
ALGO $0.866358
LEO $2.91
XTZ $3.27
MIOTA $0.985600
AVAX $15.68
CEL $6.21
EGLD $125.47
COMP $445.51
STETH $2,995.42
KSM $251.38
HT $12.63
UST $1.00
SUSHI $10.80
DCR $152.33
HBAR $0.213998
QNT $148.47
HOT $0.010435101561
WAVES $17.89
RUNE $6.64
DASH $172.98
CHZ $0.330519
HBTC $43,875
TFUEL $0.323835
SNX $10.08
XEM $0.183840
ZEC $132.08
XDC $0.119131
HNT $15.63
ENJ $1.51
STX $1.32
NEAR $3.09
RVN $0.139150
YFI $36,081
TUSD $1.00
FLOW $22.20
ZIL $0.096280701841
IOTX $0.119378
SAFEMOON $0.000002055113
TEL $0.018552432865
CLOUT $99.89
QTUM $10.12
BAT $0.696237
BCHA $54.61
NEXO $1.82
MANA $0.779030
BTG $57.86
PAX $1.00
ONE $0.089852635606
BNT $3.89
XSUSHI $12.47
DGB $0.058679738018
KCS $10.75
TITAN $8.35
SC $0.017170311254
{'BTC': '$44,124', 'ETH': '$3,008.67', 'USDT': '$1.00', 'BNB': '$375.26', 'ADA': '$1.70', 'XRP': '$0.942681', 'DOGE': '$0.255957', 'USDC': '$1.00', 'DOT': '$20.18', 'UNI': '$27.07', 'BUSD': '$1.00', 'SOL': '$40.00', 'BCH': '$598.93', 'LTC': '$163.80', 'LINK': '$24.36', 'WBTC': '$44,081', 'ICP': '$62.06', 'MATIC': '$1.28', 'ETC': '$58.58', 'XLM': '$0.319697', 'VET': '$0.104720', 'THETA': '$6.64', 'LUNA': '$16.00', 'FIL': '$67.32', 'OKB': '$22.29', 'TRX': '$0.081499304270', 'DAI': '$1.00', 'FTT': '$48.11', 'CUSDC': '$0.022222942221', 'AAVE': '$381.38', 'XMR': '$258.06', 'CETH': '$60.28', 'CDAI': '$0.021684507697', 'EOS': '$4.60', 'CAKE': '$18.80', 'AXS': '$69.08', 'ATOM': '$13.65', 'GRT': '$0.793827', 'SHIB': '$0.000007551040', 'KLAY': '$1.43', 'CRO': '$0.138263', 'NEO': '$46.96', 'BTT': '$0.004398147292', 'AMP': '$0.060216111886', 'MKR': '$3,200.18', 'BSV': '$152.82', 'ALGO': '$0.866358', 'LEO': '$2.91', 'XTZ': '$3.27', 'MIOTA': '$0.985600', 'AVAX': '$15.68', 'CEL': '$6.21', 'EGLD': '$125.47', 'COMP': '$445.51', 'STETH': '$2,995.42', 'KSM': '$251.38', 'HT': '$12.63', 'UST': '$1.00', 'SUSHI': '$10.80', 'DCR': '$152.33', 'HBAR': '$0.213998', 'QNT': '$148.47', 'HOT': '$0.010435101561', 'WAVES': '$17.89', 'RUNE': '$6.64', 'DASH': '$172.98', 'CHZ': '$0.330519', 'HBTC': '$43,875', 'TFUEL': '$0.323835', 'SNX': '$10.08', 'XEM': '$0.183840', 'ZEC': '$132.08', 'XDC': '$0.119131', 'HNT': '$15.63', 'ENJ': '$1.51', 'STX': '$1.32', 'NEAR': '$3.09', 'RVN': '$0.139150', 'YFI': '$36,081', 'TUSD': '$1.00', 'FLOW': '$22.20', 'ZIL': '$0.096280701841', 'IOTX': '$0.119378', 'SAFEMOON': '$0.000002055113', 'TEL': '$0.018552432865', 'CLOUT': '$99.89', 'QTUM': '$10.12', 'BAT': '$0.696237', 'BCHA': '$54.61', 'NEXO': '$1.82', 'MANA': '$0.779030', 'BTG': '$57.86', 'PAX': '$1.00', 'ONE': '$0.089852635606', 'BNT': '$3.89', 'XSUSHI': '$12.47', 'DGB': '$0.058679738018', 'KCS': '$10.75', 'TITAN': '$8.35', 'SC': '$0.017170311254'}
Resultado desejado:
'BTC': '$44,124'
Eu tentei:
print(data)[1]
data.get(0)
Além disso, se eu retirar o argumento "zip" quando o dicionário estiver definido, recebo o erro
data = dict (sym, price) TypeError: dict esperado no máximo 1 argumento, obteve 2
também tentei configurar o dicionário assim:
val = dict(((token_sym,token_price,row)for row in rows))
mas só retorna o último valor, não salva todos os valores no dicionário
espero que alguém possa me dizer onde estou falhando. Obrigado
Os dicionários usam um sistema de "chave" em vez de depender de índices como os List
objetos fazem. Consulte a chave para obter o valor desejado.
Além disso, se for iterar por cada uma das moedas, em vez de criar uma lista delas usando, .append()
você pode considerar a criação de um dicionário, pois isso permitiria uma pesquisa mais rápida.
Em seu exemplo atual, você teria que revisar toda a lista de dados e verificar se o dicionário é o que deseja. Se você apenas fizer um dicionário, poderá fazer o seguinte:
coin_results = {}
for coin in coin_table.find_all('tbody'):
rows = coin.find_all('tr')
for row in rows:
token_sym = row.find('span', class_ = 'tw-hidden d-lg-inline font-normal text-3xs ml-2').text.strip()
token_price = row.find('span', {'data-target' : 'price.price'}).text.strip()
# dictionary creation
coin_dict = {token_sym: token_price}
coin_results.update(coin_dict)
Isso resultaria em:
# Final dictionary
coin_results = {
'BTC': 'some price data here',
'other coin here': 'some other price data',
...
}
# Access this like:
coin_results['BTC']
>>> 'some price data here'
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras