You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比爬取表格中不同类型数据的最大值并修复输出错误

问题原因与修改方案

核心问题

原代码存在多处逻辑错误:

  • 最大值统计逻辑错误:每次循环仅保留当前行的单类余额,未和同类型的历史最大值比较,导致最大值被后续小值覆盖
  • 最终打印的参数顺序颠倒,把钱包最大值和合约最大值输出位置搞反
  • 输出顺序不符合要求,原代码先打印明细再打印汇总,需要调整为先打印汇总再打印明细
  • 数值输出未做格式还原,需要保留千分位和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()

关键修改说明

  1. 调整最大值统计逻辑:当前行是合约地址时,仅和已存储的最大合约持仓比较更新;钱包地址同理仅和最大钱包持仓比较,避免不同类型数值互相干扰
  2. 先存储所有明细数据,统计完所有最大值后再按要求先打印汇总、后打印明细
  3. 新增数值格式化函数,输出时保留千分位分隔符和4位小数,和预期格式一致
  4. 调整打印对齐参数,输出排版和预期效果匹配

内容的提问来源于stack exchange,提问作者rbutrnz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:36:04