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
相关产品推荐
相关产品推荐

