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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:27:00