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

Python使用bs4解析CoinMarketCap表格数据失败相关问题咨询

代码无法运行的核心原因

你写的逻辑本身没有原则性错误,问题出在两点:

  1. CoinMarketCap的历史数据页面是前端动态渲染的,直接用requests.get拿到的初始HTML里没有完整的表格数据,数据是浏览器加载页面后通过JS异步请求、再渲染到DOM里的,所以bs4在初始HTML里找不到你要的元素,自然返回空。
  2. 你第二个代码片段里混淆了bs4的方法用法:soup.select()只接受CSS选择器字符串作为参数,不需要额外传属性字典,正确写法是soup.select('div.b4d71h-2.hgYnhQ');如果要传属性字典匹配,应该用soup.find('div', {'class': 'b4d71h-2 hgYnhQ'}),方法用错自然匹配不到结果。

疑问解答

1. 随机类名的原因和定位策略

这些无意义的类名90%以上是前端工程化工具自动生成的:现在主流的React/Vue等框架都会用CSS Modules、Tailwind等方案自动生成哈希类名,目的是避免不同组件的CSS类名冲突,并不是网站专门做的反爬措施,但客观上确实增加了DOM解析的不稳定性。
定位元素的时候优先选择以下特征,比类名稳定得多:

  • 带固定前缀的自定义属性,比如你之前用到的td[data-format-market-cap]这类data-开头的属性,基本不会随便变
  • 标签的层级顺序,比如表格下的第几个tr、第几个td
  • 固定文本内容的节点锚定
    绝对不要用随机哈希类名作为唯一匹配条件,这类类名每次网站前端发版都会变,爬取逻辑根本没法长期用。

2. 找底层数据接口的方法

用浏览器的开发者工具就能快速找到接口,步骤很简单:

  1. 打开目标页面后按F12调出开发者工具,切换到「网络」面板
  2. 筛选面板里的「XHR/ fetch」选项,刷新页面
  3. 挨个看列表里的请求,点进去看「响应」标签,找返回内容是JSON格式、包含你要的日期、收盘价、交易量等数据的请求
  4. 拿到这个请求的URL和参数,直接用requests请求这个接口就行,返回的都是结构化数据,不需要再解析DOM,稳定性远高于页面爬取。

可行的修正方案

如果不想找接口,可以直接用无头浏览器渲染完整页面后再解析,示例代码用Playwright实现:

import pandas as pd
from bs4 import BeautifulSoup
from playwright.sync_api import sync_playwright

def get_coinmarketcap_info(coin_slug, s_date, e_date):
    url = f"https://coinmarketcap.com/currencies/{coin_slug}/historical-data/?start={s_date}&end={e_date}"
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        page.goto(url, wait_until="networkidle")
        # 等待表格渲染完成
        page.wait_for_selector("table tbody tr")
        html = page.content()
        browser.close()
    
    soup = BeautifulSoup(html, "lxml")
    for items in soup.select("table tbody tr"):
        tds = items.select("td")
        if len(tds) < 6:
            continue
        date = tds[0].get_text(strip=True)
        close = tds[4].get_text(strip=True)
        volume = tds[5].get_text(strip=True)
        marketcap = tds[6].get_text(strip=True)
        yield date, close, volume, marketcap

if __name__ == '__main__':
    dataframe = get_coinmarketcap_info('xrp', s_date='20130428', e_date='20191020')
    df = pd.DataFrame(dataframe, columns=["日期", "收盘价", "交易量", "市值"])
    print(df)

运行前先安装依赖:pip install pandas playwright beautifulsoup4 lxml && playwright install chromium


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:36:04