pandas.read_html读取网页报no tables found 404错误如何修复
报错根因
pandas.read_html()仅能解析页面源码中静态存在的<table>标签,无法执行页面JavaScript完成动态内容渲染,结合CoinMarketCap的站点规则,触发报错的直接原因有两个:
- pandas发起请求时默认携带的User-Agent带有爬虫标识,会被站点反爬机制识别,直接返回404/403响应,不返回正常页面内容
- 你使用的旧版历史数据URL早已完成改版,当前页面的所有行情数据都由前端JS异步拉取后渲染,初始返回的HTML源码中不存在包含行情数据的表格标签,自然触发
ValueError: no tables found报错。
解决步骤
- 替换原有直接读取HTML页面的逻辑,改用结构化接口拉取数据,稳定性远高于解析HTML,同时不受前端动态渲染影响。拉取时添加正常浏览器的请求头,绕过基础反爬校验。
- 修正后可直接运行的完整代码:
from math import pi import pandas as pd import requests from bokeh.plotting import figure, show, output_file # 构造合法浏览器请求头 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" } # 拉取指定时间范围的比特币历史行情 url = "https://api.coinmarketcap.com/data-api/v3/cryptocurrency/historical" params = { "id": 1, "convertId": 2781, "timeStart": "2019-02-20", "timeEnd": "2019-03-20" } resp = requests.get(url, headers=headers, params=params) resp_data = resp.json() # 解析结构化数据为DataFrame df = pd.DataFrame([item["quote"] for item in resp_data["data"]["quotes"]]) df["Date"] = pd.to_datetime(df["timestamp"]) df.rename(columns={"open": "Open", "high": "High", "low": "Low", "close": "Close"}, inplace=True) df = df.sort_values("Date").reset_index(drop=True) inc = df.Close > df.Open dec = df.Open > df.Close w = 12 * 60 * 60 * 1000 tools = "pan,wheel_zoom,box_zoom,reset,save" p = figure(x_axis_type="datetime", tools=tools, plot_width=1200, title="Bitcoin Candlesticks") p.xaxis.major_label_orientation = pi / 4 p.grid.grid_line_alpha = 0.3 p.segment(df.Date, df.High, df.Date, df.Low, color="black") p.vbar(df.Date[inc], w, df.Open[inc], df.Close[inc], fill_color="#D5E1DD", line_color="black") p.vbar(df.Date[dec], w, df.Open[dec], df.Close[dec], fill_color="#F2583E", line_color="black") output_file("bitcoin.html", title="Bitcoin Candlesticks") show(p)
- 若仅做单次临时测试,也可手动在浏览器中打开目标URL,等页面完全加载后将网页保存为本地HTML文件,再调用
pandas.read_html("本地文件路径.html")读取本地文件解析表格,同样可以绕过动态渲染和反爬限制,但该方法不适用自动化、批量拉取数据的场景。 - 若调整请求逻辑后依然返回404,优先排查本地网络连通性,部分网络环境下无法正常访问CoinMarketCap服务,会直接返回404页面。
内容的提问来源于stack exchange,提问作者Nas
相关产品推荐
相关产品推荐

