如何用Python+BeautifulSoup抓取BSCScan表格百分比值与Contract标识
问题修复说明
问题1(百分比显示0.0000%)原因
目标站点的百分比数值默认不会直接渲染在td标签的文本内容中,真实值存储在对应td标签的data-order自定义属性里,直接提取文本只能拿到默认占位的0.0000%。同时原代码调用requests时参数写法错误,请求头未正常生效,也可能导致返回内容不完整。
问题2(提取Contract文本)实现方法
直接定位地址列td下的指定i标签,提取data-original-title属性值即可,不存在该标签时返回空字符串不影响输出。
修正后完整代码
import requests from bs4 import BeautifulSoup url = "https://bscscan.com/token/generic-tokenholders2?m=normal&a=0x8076c74c5e3f5852037f31ff0093eeb8c8add8d3" header = {"User-Agent": "Mozilla/5.0"} # 修正requests传参写法,明确指定headers参数名 reqblockdetails = requests.get(url, headers=header, timeout=5) soupblockdetails = BeautifulSoup(reqblockdetails.content, 'html.parser') rowsblockdetails = soupblockdetails.find_all('table')[0].find_all('tr', limit=10) for row in rowsblockdetails[1:]: tds = row.find_all('td') rank = tds[0].text.strip() address = tds[1].text.strip() amount = tds[2].text.strip() # 从data-order属性取真实百分比值,格式化为4位小数加百分号 percentage_val = float(tds[3].get('data-order', 0)) percentage = f"{percentage_val:.4f}%" # 提取contract标识 contract_tag = tds[1].find('i', class_='far fa-file-alt text-secondary') contract_text = contract_tag.get('data-original-title', '') if contract_tag else '' # 调整格式化宽度适配长地址,避免显示错位 print(f" {rank:<3} {address:<45} {amount:>30} {percentage:>10} {contract_text:>10}")
改动点说明
- 修复requests调用参数错误,确保请求头正常生效,避免被站点反爬拦截返回异常内容
- 百分比取值改为从td的
data-order属性获取,再做格式化处理,和实际展示值一致 - 新增i标签属性提取逻辑,匹配到对应标签时输出Contract文本,否则留空
- 调整输出格式化的宽度配置,适配长地址内容,避免显示错位
内容的提问来源于stack exchange,提问作者rbutrnz
相关产品推荐
相关产品推荐

