pandas.read_html() 是最快读取 HTML 表格并保存为 Excel 的方法,它自动解析 <table> 标签返回 DataFrame 列表,配合 to_excel() 即可导出;需注意路径规范、编码设置、多表格索引选取,并对 JS 渲染内容先用 Playwright 或 Selenium 获取渲染后 HTML。
用 pandas.read_html() 最快读取 HTML 表格并保存为 Excel
多数 html 转 excel 的需求,本质是「把网页里的表格数据导出来」。pandas.read_html() 是最直接的解法——它能自动识别 <table> 元素,返回 list of dataframe,后续用 to_excel() 一步落地。
常见错误现象:直接用 open() 读 HTML 文件再手动解析标签,结果遇到嵌套 <tr>/<td>、colspan、空行或 JS 渲染内容就卡住;或者误用 xlwt 等老库,不支持 .xlsx 格式。
- 确保 HTML 文件本地可访问(路径别含中文或空格,否则
read_html()可能报FileNotFoundError或编码错误) - 如果页面含多个表格,
read_html()默认返回全部,用索引取你需要的那个:dfs = pd.read_html("page.html"); df = dfs[0] - 加
header=0参数让第一行当列名,否则可能全变成普通数据行 - 遇到编码问题(如乱码),在
read_html()里显式传encoding="utf-8"(注意:不是所有版本都支持该参数,pandas ≥ 1.4 推荐用pd.read_html(..., encoding="utf-8"))
处理含 JavaScript 渲染的 HTML(比如动态加载的表格)
纯 read_html() 读不到浏览器渲染后的内容——它只解析原始 HTML 源码。这时候必须先“跑一遍 JS”,拿到最终 DOM。
典型场景:爬取某些后台系统导出页、BI 报表页,右键“查看网页源代码”发现 <table> 是空的,但页面上明明有数据。
- 用
selenium启动浏览器(推荐Chrome+chromedriver),get()加载页面,等table出现后再用page_source提交给read_html() - 更轻量的选择是
playwright:page.content()获取渲染后 HTML,比 selenium 启动快、内存占用低 - 千万别用
requests.get().text直接抓——没执行 JS,拿不到真实表格
openpyxl 或 xlsxwriter 手动写入 HTML 内容(非表格结构)
如果 HTML 不是标准表格,而是带样式、段落、标题、图片的富文本报告,read_html() 就无能为力了。这时得降级为“提取文字+排版模拟”。
立即学习“前端免费学习笔记(深入)”;
使用场景:把内部周报 HTML 页面转成 Excel 供领导离线查阅,保留粗体、颜色、层级,但不追求像素级还原。
-
openpyxl支持单元格内富文本(Font,PatternFill),但无法直接导入 HTML 标签;需用BeautifulSoup解析<b>,<h2>,<font color>等,再逐段写入对应样式 -
xlsxwriter不支持单元格内多格式文本,所有内容会被压成纯字符串,适合只要数据不要样式的场景 - 图片处理最麻烦:HTML 中的
<img src="xxx.png">需提前下载到本地,再用insert_image()插入——路径必须是绝对路径,相对路径会失败
命令行快速转换(不用写 Python)
临时救急、没装 Python 环境,或只想批量转几十个静态 HTML 表格文件,命令行工具更省事。
错误做法:用浏览器“另存为” → 选 .xls,结果生成的是伪装成 Excel 的 HTML 文件(双击能打开,但 Excel 会报“文件格式和扩展名不匹配”)。
- 推荐
csvkit:安装后运行in2csv -f html input.html > output.csv,再用 Excel 打开 CSV(注意编码,加--encoding utf-8) - macOS 用户可用内置
textutil:textutil -convert xlsx input.html -output output.xlsx,但仅限简单结构,复杂表格会丢列 - Windows 上可调用 PowerShell + COM 对象:
$xl = New-Object -ComObject Excel.Application; $xl.Visible = $false; $wb = $xl.Workbooks.Open("C:\path\input.html"); $wb.SaveAs("C:\path\output.xlsx", 51); $wb.Close()——前提是本机装了 Excel
真正难的不是“怎么转”,而是 HTML 本身质量。表格跨行混乱、<div> 模拟表格、CSS 定位替代语义化标签……这些都会让任何自动工具失效。动手前先右键“查看网页源代码”,确认 <table> 存在且结构干净,比调参重要得多。



















