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

如何解决pd.read_html读取Dune表格报No tables found错误

报错核心原因

触发ValueError: No tables found由两个问题直接导致:

  • Dune站点是React构建的单页应用,requests.get()只能拿到未执行JavaScript的初始静态HTML壳子,页面内的表格、业务数据都是浏览器加载页面后,通过JS异步拉取接口再渲染到DOM上的。直接用BeautifulSoup解析初始响应内容,根本匹配不到class为table_table__fuS_N的表格元素,Table_Finder实际返回None,后续自然无法被pandas识别为有效表格。
  • 代码中对表格元素字符串调用.upper()方法,会把所有HTML标签、属性名强制转为大写,破坏HTML结构合法性,会进一步提升解析失败的概率。
解决方法

优先直接调用站点公开的查询结果接口拿结构化数据,稳定性远高于爬取前端渲染的DOM,实现代码如下:

import pandas as pd
import requests

api_url = "https://dune.com/api/queries/870929/results"
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(api_url, headers=headers)
resp.raise_for_status()
result_json = resp.json()
# 提取接口返回的表格行数据直接转DataFrame
df = pd.DataFrame(result_json["result"]["rows"])

如果必须解析前端渲染后的页面DOM,替换requests+BeautifulSoup组合为可执行JavaScript的页面渲染工具,以playwright为例:

import pandas as pd
from playwright.sync_api import sync_playwright

target_url = "https://dune.com/queries/870929"
with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto(target_url, wait_until="networkidle")
    # 等待表格元素加载完成,用class前缀匹配避免前端发版哈希变动导致选择器失效
    page.wait_for_selector("table[class*='table_table__']")
    table_content = page.locator("table[class*='table_table__']").inner_html()
    df = pd.read_html(f"<table>{table_content}</table>")[0]
    browser.close()

注意:Dune前端类名中fuS_N这类后缀是构建时生成的随机哈希,每次站点发版都可能变化,不要写死完整类名,用属性包含匹配的方式选择元素兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:24:24