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

Python结合BeautifulSoup如何将多层for循环打印结果单行写入文本文件

问题描述

使用Python+BeautifulSoup编写爬取bscscan.com代币交易数据并按代币分组统计的代码,可正常运行但输出效果不符合预期:控制台打印内容无法按规范写入outputfile.txt文件,写入内容混杂列表标识、排版混乱。期望实现每条统计数据单独占一行,依次展示代币合约地址、代币名称、交易笔数、交易总金额的效果。

原始问题代码
import requests
from bs4 import BeautifulSoup
from itertools import groupby

url = "https://bscscan.com/tokentxns"
soup = BeautifulSoup(requests.get(url).content, "html.parser")

data = []
for tr in soup.select("tr:has(td)"):
    tds = [td.get_text(strip=True) for td in tr.select("td")]
    _, txn_hash, tm, age, from_, _, to_, value, token = tds
    a = tr.select("a")[-1]["href"][7:]
    data.append((a, value, token))

data = sorted(data)
for _, g in groupby(data, lambda k: k[2]):
    g = list(map(list, g))
    trans = [f"{len(g)} TRANS", *[""] * (len(g) - 1)]
    total = sum(float(s.replace(",", "")) for _, s, *_ in g)
    total = [f"{total} TOTAL", *[""] * (len(g) - 1)]
    
    for subl in g[0:]:
        subl[1] = ""
        subl = ' '.join(map(str, subl))
    print(subl, end="\r")
    

    for tr, t, subl in zip(trans, total, g):
        print ("\t\t" + str(tr) + "   "  + str(t))
现有错误输出示例
['0x088bebef4e371757509e64d3508b6da6f376e2ac', '', 'DrakeBall To...(DBall)']    
['0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82', '', 'PancakeSwap ...(Cake)']    
['0x154a9f9cbd3449ad22fdae23044319d6ef2a1fab', '', 'CryptoBlades...(SKILL)']    
['0x3621f5b9786dfa52759c0392a72ac6818ed2c84f', '', 'EQIFI (EQX)']  1 TRANS  182513805147.0 TOTAL
['0x363621cb1b32590c55f283432d91530d77cf532f', '', 'BABYCAKE_Div...(BABYCA...)']  1 TRANS  37840.385 TOTAL
['0x4fd6d315bef387fad2322fbc64368fc443f0886d', '', 'Pancake LPs (Cake-L...)']    
期望输出样式
0x9c65ab58d8d978db963e63f2bfb7121627e3a739  MDX Token (MDX)         1 TRANS   97.10128249433292 TOTAL
0xacb8f52dc63bb752a51186d1c55868adbffee9c1  BunnyPark (BP)          3 TRANS   340.2936687126161 TOTAL
0xb7dba4c673bedb174dc3ff7ec65d17c863d39b16  FAT CAKE (FATCAK...)    2 TRANS   6408272.9511043355 TOTAL
0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c  Wrapped BNB (WBNB)      2 TRANS   0.4472397706686812 TOTAL
0xdae18b46e0dbfecd441c47de1a6d7b57455a83ee  Pancake LPs (Cake-L...) 1 TRANS   0.22360679774997796 TOTAL
修正方案

原始代码的核心问题在于:直接输出列表对象导致出现[]标识,多余生成了空内容的统计数组导致出现大量无效条目,缺少统一格式化和显式写入文件的逻辑。修正后代码如下:

import requests
from bs4 import BeautifulSoup
from itertools import groupby

url = "https://bscscan.com/tokentxns"
# 增加请求头避免被反爬拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
soup = BeautifulSoup(requests.get(url, headers=headers).content, "html.parser")

data = []
for tr in soup.select("tr:has(td)"):
    tds = [td.get_text(strip=True) for td in tr.select("td")]
    _, txn_hash, tm, age, from_, _, to_, value, token = tds
    a = tr.select("a")[-1]["href"][7:]
    data.append((a, value, token))

# 按代币名称排序分组
data = sorted(data, key=lambda x: x[2])
output_lines = []

for token, g in groupby(data, lambda k: k[2]):
    g_list = list(g)
    # 取当前代币的合约地址(同一代币地址一致)
    contract_addr = g_list[0][0]
    # 统计交易笔数
    trans_count = len(g_list)
    # 统计交易总金额
    total_amount = sum(float(item[1].replace(",", "")) for item in g_list)
    # 格式化行,固定宽度实现对齐效果
    line = f"{contract_addr:<45} {token:<30} {trans_count} TRANS   {total_amount} TOTAL"
    output_lines.append(line)

# 打印到控制台
for line in output_lines:
    print(line)

# 写入到目标文件
with open("outputfile.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(output_lines))

修正后代码直接按代币分组生成格式化的统计行,统一输出到控制台同时写入outputfile.txt,完全符合预期排版要求,同时新增了请求头避免被站点反爬拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 12:51:03