如何解决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
相关产品推荐
相关产品推荐

