如何对比爬取表格中不同类型数据的最大值并修复输出错误
问题原因与修改方案
核心问题
原代码存在多处逻辑错误:
- 最大值统计逻辑错误:每次循环仅保留当前行的单类余额,未和同类型的历史最大值比较,导致最大值被后续小值覆盖
- 最终打印的参数顺序颠倒,把钱包最大值和合约最大值输出位置搞反
- 输出顺序不符合要求,原代码先打印明细再打印汇总,需要调整为先打印汇总再打印明细
- 数值输出未做格式还原,需要保留千分位和4位小数
修改后完整代码
import 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') bigwallet = 0.0 bigcontract = 0.0 # 先存所有明细行,最后统一打印 rows_data = [] for row in soup.select("tr:has(td)")[:10]: tds = row.find_all("td") addr = tds[0].text.strip() trans = tds[4].text.strip() bal = tds[5].text.strip() # 处理数值 tbal = trim.sub('', bal).replace(",", "") tbal = float(tbal) if tbal else 0.0 wtype = tds[2].text.strip() # 同类型比较更新最大值 if wtype == "Contract": if tbal > bigcontract: bigcontract = tbal else: if tbal > bigwallet: bigwallet = tbal rows_data.append((addr, bal, trans, wtype)) # 格式化数值为千分位+4位小数 def format_num(num): return f"{num:,.4f}" # 先打印最大值 print(f"Largest Contract: {format_num(bigcontract)} Largest Wallet: {format_num(bigwallet)} \n") # 再打印明细 for addr, bal, trans, wtype in rows_data: print(f"{addr:45} {bal:>30} {trans:>8} {wtype}") driver.quit()
关键修改说明
- 调整最大值统计逻辑:当前行是合约地址时,仅和已存储的最大合约持仓比较更新;钱包地址同理仅和最大钱包持仓比较,避免不同类型数值互相干扰
- 先存储所有明细数据,统计完所有最大值后再按要求先打印汇总、后打印明细
- 新增数值格式化函数,输出时保留千分位分隔符和4位小数,和预期格式一致
- 调整打印对齐参数,输出排版和预期效果匹配
内容的提问来源于stack exchange,提问作者rbutrnz
相关产品推荐
相关产品推荐

