
这个工具解决什么问题
查资料的时候经常遇到这种情况:某个网页上有一张数据表——空气质量监测点、城市统计、产品参数对照——你想把它存下来做分析或写进报告。最直接的办法是鼠标框选整张表,Ctrl+C,粘进 Excel。但结果往往是灾难:表格被当成一堆纯文本塞进同一列,合并单元格的地方错位,表头跑到奇怪的位置,你还得手工一列列拆开重新对齐。行数一多,光是整理格式就能耗掉半小时,而且每粘一次结果都不一样。
- 原来的做法:在网页上框选整张表 → 复制 → 粘进 Excel → 发现全挤在一列 → 手工用「分列」功能一列列拆 → 处理合并单元格错位 → 再逐个调表头。
- 用这个工具:把网址粘进工具,点「抓取表格」,页面里所有数据表按行列结构列出来;选一张,点「导出 CSV」或「复制到剪贴板」,行列结构完整保留,粘进 Excel 自动分列。
- 省下来的:原来整理一张二十行的表要十几分钟且容易出错,现在十秒钟拿到干净的行列结构,导出的 CSV 用 Excel 直接打开就能用。
技术实现
Python 标准库实现,零第三方依赖:下载页面走 urllib.request,解析表格走 html.parser 的状态机,界面走 tkinter,最后用 PyInstaller 打包成单个 exe。选标准库的原因很直接——工具要交付给普通用户双击即用,第三方依赖越多,越容易在别人机器上因为缺包或版本冲突跑不起来。
- 用状态机解析表格,不用正则:表格的 HTML 结构嵌套很深(thead/tbody/tfoot、单元格里还有换行和嵌套标签),用正则匹配 <table> 几乎必然出错。这里继承 html.parser.HTMLParser,按标签进出维护「当前表 / 当前行 / 当前单元格」三层状态,把结构还原成二维数组。
- 嵌套表格整体跳过,只取最外层:很多网页会用嵌套表格做布局。如果把内层表格的内容也收进来,就会出现「一张表里混进另一张表的数据」——这正是用户手工复制粘贴时最常踩的串行坑。解析时只处理嵌套深度为 1 的表格,内层内容直接忽略。
- colspan / rowspan 的基本展开:遇到 colspan 就补空单元格,遇到 rowspan 就记录到待补列表,在后续行对应列位置插入空位。这样即使表格有合并单元格,导出的行列也不会错位——虽然合并信息本身无法在 CSV 里表达,但至少列是对齐的。
- 编码自动识别:先读响应头 charset,再从页面 head 里正则提取,最后按 utf-8 → gb18030 → latin-1 依次尝试解码。国内不少站点是 GBK,写死 utf-8 会全是乱码。
- 请求头禁用 gzip:带 Accept-Encoding: identity。urllib 不会自动解压 gzip,如果服务端返回压缩流,拿到的是二进制,解析必然失败。
- 导出 CSV 带 BOM,另附剪贴板通道:导出用 utf-8-sig(带 BOM),Excel 双击打开中文不乱码;另外提供「复制到剪贴板」,内容是制表符分隔的文本,粘进 Excel 会自动分列,适合只想临时用一下的场景。
技术栈:Python 3.8+、urllib + html.parser、tkinter 图形界面、PyInstaller 单文件
已知局限:只解析服务端直接返回的 HTML 表格;页面数据若由 JavaScript 动态渲染(源码里没有 table 标签),本工具抓不到;不执行页面脚本、不模拟登录。
操作教程
- 打开程序
双击 exe,窗口打开:上方是网址输入框,中间是表格清单,下方是预览区,底部是导出按钮。
预期结果:窗口正常显示,状态栏提示「先贴一个公开网页地址」。 - 抓取表格
把网页地址粘进输入框(也可以点「打开本地 HTML」选一个用浏览器另存下来的网页文件),点「抓取表格」或直接按回车。
预期结果:状态栏显示「共找到 N 张表格」,清单里按序号列出每张表的行数、列数和首行预览。 - 选择目标表格
在清单里点一行,下方预览区会显示这张表的完整内容,表头自动取第一行。列太宽可以拖下方横向滚动条。
预期结果:预览区显示完整表格,列名与网页上的表头一致。 - 导出 CSV
点「导出 CSV」,选保存位置。文件用 Excel 双击打开即用,行列结构完整。
预期结果:生成 CSV 文件,状态栏显示导出了多少行。 - 或直接粘进 Excel
点「复制到剪贴板(可直接粘进 Excel)」,然后到 Excel 里 Ctrl+V。
预期结果:内容自动分列,不需要再做「分列」操作。 - 处理抓不到的情况
如果提示「没有解析到表格」,通常是这个页面的数据由 JavaScript 动态加载,源码里没有表格标签。此时可以在浏览器里按 Ctrl+S 把渲染后的页面另存为 HTML,再用「打开本地 HTML」处理。
预期结果:另存后能正常解析出表格。
整个过程在本地完成,除了访问你指定的那个网页之外,不向任何其它服务器发送数据。
常见问题
技术实现与后续维护
本工具由我们自行开发并持续维护,每次迭代都经过本地自测。解析逻辑集中在 TableParser 一个类里,与网络、界面完全解耦——可以拿一段 HTML 字符串直接喂给它做单元测试,不需要开窗口也不需要联网。
技术构成:
src/table_scraper.py—— 唯一源码文件:TableParser 解析状态机 + 下载与解码 + tkinter 界面 + 导出DOCS/开发文档.md—— 工程结构、表格解析状态机说明、扩展点
运行环境:
本工程为 Python 项目,只需标准库:
python src\table_scraper.py
打包成单文件 exe(必须带 --noconsole,否则会弹黑色控制台窗口):
pip install pyinstaller
pyinstaller --onefile --noconsole --name "公开网页表格导出器" src\table_scraper.py
可扩展方向:
- 增加多页批量抓取与结果合并
- 增加列筛选:只保留需要的列再导出
- 增加 xlsx 导出(openpyxl)并保留表头样式
- 增加分页识别:自动抓取列表页的下一页
本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。
需要其它功能?可以定制
这个工具只做一件事:网页上一张数据表想存成 Excel,复制粘贴会串行。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。
常见的定制需求:
- 批量抓取多个结构相同的页面,把表格合并成一张总表
- 按列名做字段映射,抓完直接导出成指定表头的报表
- 增加定时抓取,把每天变化的公开数据累积成历史趋势表
- 导出为 xlsx 并保留表头样式与列宽
- 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
- 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
- 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护
使用说明与免责声明
- 本工具仅用于采集公开可见或你自身拥有权限的数据。
- 请遵守目标网站的服务条款、robots 协议及《网络安全法》等相关法律法规。
- 请合理控制请求频率,不要对目标站点造成访问压力。
- 不得用于采集个人隐私、付费墙内容或任何受法律保护的非公开数据。
- 因使用不当造成的后果由使用者自行承担;本工具不做数据二次分发。

