如何比较不同类型的两个值并从抓取的表数据中确定最大值

2024-09-30 05:22:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个url抓取了几行数据。我试图将一种类型的一个最大值与另一个最大值进行比较。我遗漏了一些东西,因为我没能正确地提取出来

import requests, re, time
from bs4 import BeautifulSoup
from selenium import webdriver
trim = re.compile(r'[^\d,.]+')

driver = webdriver.Chrome('chromedriver.exe')
url = "https://poocoin.app/rugcheck/0x8076c74c5e3f5852037f31ff0093eeb8c8add8d3/top-holders"
driver.get(url)

time.sleep(8)
soup = BeautifulSoup(driver.page_source, 'lxml')
t = soup.find('table', class_='table table-bordered table-condensed text-small')

bigwallet = 0
bigcontract = 0
contractbalance = 0
walletbalance = 0

for row in soup.select("tr:has(td)")[:10]:
    addr = row.find_all("td")[0].text[0:]
    trans = row.find_all("td")[4].text[0:]
    bal = row.find_all("td")[5].text[0:].strip()
    tbal = trim.sub('', bal).replace(",", "")
    tbal = float(tbal)
    wtype = row.find_all("td")[2].text[0:].strip()

    if (str(wtype) == "Contract"):
        contractbalance = float(tbal)
    else:
        walletbalance = float(tbal)
    if (walletbalance) > (contractbalance):
        bigwallet = walletbalance
    else:
        bigcontract = contractbalance

    bigwallet = bigwallet
    bigcontract = bigcontract
    print(" {}    {:<20} {:<5} {:>5} ".format(addr, bal, trans, wtype))
print (" Largest Contract: {}           Largest Wallet: {} ".format(bigwallet, bigcontract))
driver.quit()

当前输出:#——当前有问题的输出

0x9adc6fb78cefa07e13e9294f150c1e8c1dd566c0    12,704,309,869,844.8669   325911  Contract 
0xc95063d946242f26074a76c8a2e94c9d735dfc78    7,745,539,348,064.8244    11      Wallet  
0x0000000000000000000000000000000000000001    423,229,310,780,801.1327  159     Contract 
0xff3dd404afba451328de089424c74685bf0a43c9    15,407,439,439,186.9579   389180  Contract 
0x86b695aaa2600668cec754c7827357626b188054    10,311,345,756,789.1980   9       Wallet 
0x010b86c90654905611b31dbfaf5883ba616b9833    0.0000                    1       Wallet 
   #-- problematic part of my code
Largest Contract: 0           Largest Wallet: 15407439439186.957 

想要的输出:

Largest Contract: 423,229,310,780,801.1327     Largest Wallet: 10,311,345,756,789.1980 

0x9adc6fb78cefa07e13e9294f150c1e8c1dd566c0     12,704,309,869,844.8669   325911  Contract 
0xc95063d946242f26074a76c8a2e94c9d735dfc78      7,745,539,348,064.8244       11  Wallet  
0x0000000000000000000000000000000000000001    423,229,310,780,801.1327      159  Contract 
0xff3dd404afba451328de089424c74685bf0a43c9     15,407,439,439,186.9579   389180  Contract 
0x86b695aaa2600668cec754c7827357626b188054     10,311,345,756,789.1980        9  Wallet 
0x010b86c90654905611b31dbfaf5883ba616b9833                      0.0000        1  Wallet 

Tags: textdrivertableallfindtdrowwallet
2条回答

您可以直接使用内置的max()函数来获取合同和钱包的最大值,而不是所有这些比较

代码如下:

import requests, re, time
from bs4 import BeautifulSoup
from selenium import webdriver
trim = re.compile(r'[^\d,.]+')

driver = webdriver.Chrome('chromedriver.exe')
url = "https://poocoin.app/rugcheck/0x8076c74c5e3f5852037f31ff0093eeb8c8add8d3/top-holders"
driver.get(url)

time.sleep(8)
soup = BeautifulSoup(driver.page_source, 'lxml')
t = soup.find('table', class_='table table-bordered table-condensed text-small')

bigwallet = 0
bigcontract = 0
contractbalance = 0
walletbalance = 0

for row in soup.select("tr:has(td)")[:10]:
    addr = row.find_all("td")[0].text[0:]
    trans = row.find_all("td")[4].text[0:]
    bal = row.find_all("td")[5].text[0:].strip()
    tbal = trim.sub('', bal).replace(",", "")
    tbal = float(tbal)
    wtype = row.find_all("td")[2].text[0:].strip()

    if (str(wtype) == "Contract"):
        contractbalance = float(tbal)
        bigcontract = max(bigcontract, contractbalance)
    else:
        walletbalance = float(tbal)
        bigwallet = max(bigwallet, walletbalance)
    
    print(" {}    {:<20} {:<5} {:>5} ".format(addr, bal, trans, wtype))
print (" Largest Contract: {}           Largest Wallet: {} ".format(bigcontract, bigwallet))
driver.quit()
 0x9adc6fb78cefa07e13e9294f150c1e8c1dd566c0    12,705,728,079,579.6744 325911 Contract 
 0xc95063d946242f26074a76c8a2e94c9d735dfc78    7,745,635,776,415.0881 11    Wallet 
 0xa8736b9585a01d6dcc1b6e2fc9dc208552c34b58    20,000,000,001,566.1322 6     Contract 
 0x0000000000000000000000000000000000000001    423,234,579,788,211.4459 159   Contract 
 0xff3dd404afba451328de089424c74685bf0a43c9    15,372,532,667,134.5367 389418 Contract 
 0x86b695aaa2600668cec754c7827357626b188054    10,311,474,128,231.8625 9     Wallet 
 0x010b86c90654905611b31dbfaf5883ba616b9833    0.0000               1     Wallet 
 0x0add13cde4c61734f46e245b1b5fe3afe9b6bc29    0.0000               1     Wallet 
 0xc5becfc3771400ac372c3b1a0712899c72f75792    39.1084              1     Wallet 
 0xcc64ea842fcde4283cf239259f7462ef809c44fd    149,028.9837         36    Wallet 
 Largest Contract: 423234579788211.44           Largest Wallet: 10311474128231.863 

您可以将所有这些值收集到相应的列表中,然后在这些值中取max

bigwallet = [] # List of wallet values
bigcontract = [] # List of contract values

for row in soup.select("tr:has(td)")[:10]:
    addr = row.find_all("td")[0].text[0:]
    trans = row.find_all("td")[4].text[0:]
    bal = row.find_all("td")[5].text[0:].strip()
    tbal1 = trim.sub('', bal).replace(",", "")
    tbal = float(tbal1)
    wtype = row.find_all("td")[2].text[0:].strip()

    if (str(wtype) == "Contract"):
        bigcontract.append(tbal) # Append to bigcontract if its a contact one else append to bigwallet.
    else:
        bigwallet.append(tbal)
    #print(" {}    {:<20} {:<5} {:>5} ".format(addr, bal, trans, wtype))
print (" Largest Contract: {}           Largest Wallet: {} ".format(max(bigcontract),max(bigwallet))) # print max of bigcontact and big wallet
driver.quit()
 Largest Contract: 423234543343603.1           Largest Wallet: 10311473240313.781 

相关问题 更多 >

    热门问题