BeautifulSoup爬取CoinMarketCap加密货币价格小数位显示异常问题排查
问题原因
- 前10条数据你提取的是页面渲染后的可见文本,CoinMarketCap前端默认仅展示2位小数的截断值,完整精度数据存放在DOM节点的属性中,不在可见文本里。
- 10条之后的数据处理有两个问题:一是直接将
tr.contents转字符串再分割的方式极不稳定,容易截断价格字符串;二是将价格转为float类型后,浮点数的默认打印规则会自动省略末尾无意义的0,0.00开头的极小值还会出现显示截断为0.0的问题。
修复方案
不用区分前10条和后续数据的处理逻辑,统一提取DOM节点存储的完整精度价格属性即可,修复后的代码如下:
from bs4 import BeautifulSoup import requests url = "https://coinmarketcap.com/" # 添加请求头避免被反爬返回残缺页面 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } resp = requests.get(url, headers=headers) doc = BeautifulSoup(resp.text, "html.parser") # 直接获取所有行 price_rows = doc.tbody.find_all("tr") for row in price_rows: # 定位包含price类名的价格td节点 price_node = row.find("td", class_=lambda c: c and "price" in c) if not price_node: continue # 提取节点存储的完整精度价格字符串,不要转float full_price = price_node.span["data-price"] # 若需要数值运算可使用Decimal保留精度,不要用float # from decimal import Decimal # price_num = Decimal(full_price) print(full_price) print()
修复说明
- 增加请求头规避站点反爬策略,确保返回的HTML结构完整
- 统一使用属性定位的方式提取价格,不再依赖节点索引或者文本分割,适配所有100条数据的结构
- 直接提取DOM属性中存储的原始精度价格,避免前端显示截断
- 不使用float类型存储价格,规避浮点数精度丢失和显示截断问题,如需数值运算可使用Python标准库的
Decimal类型处理。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

