跳到主内容

公开网页表格导出 - 免费给个网址,把网页里的数据表导出成 Excel(爬虫工具)

免费下载公开网页表格导出 v1.0.0
平台:Windows 10/11 (64位)大小:7.8 MB版本:v1.0.0更新:
下载地址 ▾
解压后双击即可运行,无需安装任何运行环境,不联网、不上传数据。
网页上有张数据表想存进 Excel,手工框选复制一遇到合并单元格就会串行错位
软件名称公开网页表格导出
版本v1.0.0
授权免费(可自由使用与转发)
运行方式本地运行,不上传数据
所属分类爬虫工具

这个工具解决什么问题

做运营和数据分析的人天天遇到这个场景:看到一张公开榜单、行情表或统计报表,想存到 Excel 里做二次分析。做法通常是鼠标框选整张表,Ctrl+C,切到 Excel,Ctrl+V —— 然后就出问题了。列一多,粘贴后经常整体错位,某个字段跑到隔壁列去了;如果表格里有合并单元格(比如「华东区」纵向占了 3 行),粘贴的结果更是一塌糊涂,下面所有行都会整体左移,你得手工一格一格挪回来。数据量大一点的表,光是把列对齐就要花十几分钟,而且改完还不确定有没有挪错。更麻烦的是表格跨页显示的情况——第一页的表头和第二页的数据粘在一起就完全乱套了。其实这类表格在 HTML 里是有明确结构的(table / tr / td 标签加上 rowspan、colspan 属性),结构信息一直都在,只是手工复制粘贴会把它丢掉。真正可靠的做法是让程序按 HTML 的结构去解析,把合并单元格的位置关系保留下来,再原样写进 Excel。

  • 原来的做法:鼠标框选表格 → Ctrl+C → 切到 Excel → Ctrl+V,然后手工修正错位的列。遇到合并单元格时,下面所有行的列都会左移,得逐个单元格挪回来;表格跨页时表头还会和数据混在一起。一张几十行的表,对齐列就要十几分钟
  • 用这个工具:把网页地址粘给工具,它自动识别页面里所有表格、按 HTML 的 rowspan/colspan 还原合并单元格的真实位置,然后导出成 CSV 或 Excel,每张表一个工作表
  • 省下来的:一张表的导出从十几分钟的手工对齐缩短到 1 秒内完成,而且是按 HTML 结构精确还原,不存在挪错列的可能

技术实现

整个工具只用 Python 标准库,运行期不需要 pip 安装任何东西,打包后是单个 exe(约 9 MB),运行时不写注册表、不需要管理员权限、不需要 API Key。设计上第一条原则就是零第三方依赖——为此放弃了 requests 和 BeautifulSoup,改用 urllib 加标准库的 html.parser。这个取舍的直接收益是打包体积从 20 MB 级别降到 9 MB,且避开了 lxml 这类 C 扩展在 PyInstaller 下的打包坑;代价是编码嗅探和 HTTP 细节要自己处理,但这两块加起来不到 80 行。数据流是一条单向直线:URL → 规范化 → robots 检查 → 下载并解压 → 编码嗅探解码 → HTML 增量解析成二维矩阵 → 过滤排版用假表格 → 导出 CSV 或 XLSX,全程没有状态机和全局状态。核心难点是 rowspan / colspan 的处理,用「占位网格」记录被合并单元格预定的位置,从根本上避免了手工复制粘贴必然出现的列错位。

  • rowspan / colspan 的占位网格算法:这是本工具与「手工复制粘贴」最本质的区别。朴素解析器把每个 td 依次追加到当前行,遇到 rowspan=2 时下面那一行所有列都会整体左移——这正是手工复制必然串行的原因。本工具维护一个 _pending 占位网格(结构是 {未来行号: {列号: 0}}),在 _commit_cell() 里做三件事:写入前先跳过被上级 rowspan 占用的列(while col in pending: col += 1)、按 colspan 占宽写入、写完把后续行对应列登记进 _pending。配套的 _flush_row() 里有个关键条件:即使某行没有任何单元格内容,只要被上级占位也必须保留(if row or occupied),否则纵向合并的表格会整体塌陷。
  • 不依赖 requests 和 BeautifulSoup 的取舍:需求只有「取 table 这一种子结构」,用通用解析器属于杀鸡用牛刀。requests + BS4 + lxml 会让打包体积增加约 12 MB,且 lxml 是 C 扩展,在 PyInstaller 下容易出现找不到 DLL 的问题。改用标准库 urllib + html.parser 后,打包体积控制在 9 MB,且行为完全可控。html.parser 对畸形 HTML 的容错也足够好——它会自动补全未闭合标签,这对真实世界的网页至关重要。若日后要换回 BS4,只需重写 TableCollector 一个类,外部接口保持不变,其余 800 行代码完全不用动。
  • 五级优先的编码嗅探:顺序是 HTTP 头 charset → BOM → meta 声明 → 字节特征猜测 → latin-1 兜底,顺序不能乱。BOM 见到即确定(EF BB BF 是 UTF-8,FF FE 是 UTF-16);meta 声明必须排在字节猜测之前,因为中文老站(政府、学校)大量靠 meta 声明 GB2312 而响应头不带 charset,只读头会错按 UTF-8 解导致中文全乱;字节特征猜测放最后,是因为 UTF-8 页面里偶然出现「像 GBK」的序列时贸然猜 GBK 会把好页面解坏。另外 gb2312 / gbk 一律升级成 gb18030——超集解子集永远安全,还能多解出生僻字。latin-1 永不失败,保证函数不抛异常。
  • GBK 字节特征的启发式判定:_looks_like_gb18030() 统计双高字节组合的出现占比(首字节 0x81-0xFE、次字节 0x40-0xFE),比例超过 15% 就认为可能是 GBK。阈值是实测调出来的:真实 GBK 页面通常在 30% 以上,UTF-8 中文是三字节 E4-E9 开头、不会产生大量双高字节对,占比接近 0,15% 是两者之间的安全分界。这是启发式、会误判,但后面还有候选链逐个尝试解码兜底,所以不影响最终正确性。
  • 不依赖 openpyxl 直接生成 xlsx:xlsx 本质是 zip 加若干 XML,最小可用结构需要 6 个文件:[Content_Types].xml(缺它 Excel 直接拒绝打开,报「文件格式无效」)、_rels/.rels、xl/workbook.xml、xl/_rels/workbook.xml.rels、xl/styles.xml、xl/worksheets/sheetN.xml。这里用 zipfile 手工拼装而不引入 openpyxl,省下约 8 MB 体积。三个易错点都已处理:单元格文本必须 XML 转义(内容里带 & 的单元格会让整个文件报错);sheet 名有 31 字符上限且不能含 : \ / ? * [ ],不处理会让 Excel 提示「文件已损坏」属于静默失败;列号转换必须 divmod(idx - 1, 26),因为 Excel 是 1 基字母无零的怪进制,少减这个 1 会导致列号整体错位一格。
  • 单元格文本的空白规范化:HTML 源码里 td 内的缩进换行都是空白字符,原样输出会让 CSV 每行逗号数不一致、Excel 打开一片错乱。统一用 re.sub(r'\s+', ' ', raw) 压成单空格。两种特殊空白要先单独处理:\xa0( )在财经类站点极常见,不转成普通空格的话正则 \s+ 匹配不到它,会出现「看着是空格但压不掉」;\u200b(零宽空格)是一些 CMS 插入的防复制标记,直接删除。另外 br 标签也转成空格,保证单元格内永不含换行符。
  • 假表格过滤与表头去重:网页里除了目标数据表,往往还有拿 table 做排版的导航栏和页脚,特征是行列很少。用「至少 2 行 × 2 列」过滤掉它们,阈值刻意定得很宽松——真正被滤掉的只有 1×N 的排版碎片,避免误伤真实的小表(并留了 --min-rows 1 --min-cols 1 的后门)。表头去重只在第一行确实有重复非空列名时才动手,加 _2、_3 后缀,因为「第一行到底是不是表头」工具无法可靠判断,贸然改动数据行会破坏用户数据,这里刻意保守。

技术栈:Python 3.8+、零第三方依赖(纯标准库)、urllib + html.parser 手写解析、PyInstaller 单文件打包

已知局限:只解析服务器直接返回的静态 HTML,不执行 JavaScript——如果数据是前端动态渲染的(比如很多单页应用),本工具抓不到,这是设计边界不是缺陷。嵌套表格(table 里套 table)不单独处理,内层表格的文字会被并入外层单元格;现实网页里这种情况占比极低,实现它会让解析器复杂度翻倍。不解析 CSS 隐藏的行,若网页用 display:none 藏了一些行会被一起导出。编码的字节特征判定只是启发式、可能误判,但有候选链兜底。robots 检查只做基础的 Disallow 前缀匹配,未实现完整的 RFC 9309 规范(通配符、Crawl-delay 等),因为本工具是手动抓单页而非爬站,过度实现容易误拦正常访问。

操作教程

  1. 解压压缩包
    把 zip 解压到任意文件夹。不需要安装 Python,不需要管理员权限,不用敲任何安装命令。
    预期结果:看到 web_table_export.exe 和 使用说明.txt 两个文件
  2. 先跑一遍内置示例
    在该文件夹地址栏输入 cmd 回车打开命令行,执行 web_table_export.exe --demo。这一步不需要准备任何文件,也不需要联网。
    预期结果:当前目录出现 table_output 文件夹,里面有 表格1.csv 和 汇总.xlsx,屏幕上还会打印出示例表的实际内容,能直观看到合并单元格「丙集团」被正确展开
  3. 找到你要抓的网页
    在浏览器里打开那个有数据表的页面,把地址栏的完整网址复制下来。检查一遍:这个页面不需要登录就能看到数据吗?如果必须登录,本工具抓不到。
    预期结果:拿到一个形如 https://example.com/ranking 的完整网址
  4. 先看看页面里有几张表(推荐)
    执行 web_table_export.exe --url 你的网址 --list。这一步只检查不导出,会列出页面里所有表格的数量和尺寸,以及每张表的表头样例。
    预期结果:看到形如「第 1 张(页面第 1 个 table):8 行 × 4 列,表头示例:排名 | 名称 | 年度数据」的列表,据此确认目标表是第几张
  5. 正式导出
    执行 web_table_export.exe --url 你的网址。默认导出 CSV,每张表一个文件。如果页面里有不止一张表而你只想导其中一张,加上 -n 序号,例如 -n 2。
    预期结果:table_output 目录里出现导出好的文件,屏幕打印每张表的行列数和文件名
  6. 改成 Excel 格式(可选)
    如果更习惯用 Excel,把命令加上 -f xlsx。多张表会合并到同一个工作簿里,每张表一个工作表,在 Excel 底部标签页切换。
    预期结果:得到 table_output/example.com.xlsx,用 Excel 或 WPS 打开,底部能看到 表1、表2 等标签
  7. 拿去用
    打开导出的文件开始分析。所有列都和网页上的位置一一对应,合并单元格的位置也已还原。
    预期结果:数据列对齐正确,不需要任何手工调整

参数说明

参数说明必填默认值
-u, --url要抓取的网页地址(可省略 https://)是—
-f, --format导出格式:csv(每表一个文件)或 xlsx(多表合并成一个工作簿)否csv
-n, --table只导出第 N 张表(从 1 开始),不指定则导出全部符合筛选条件的表否全部
-o, --out输出目录否table_output
-l, --list只列出页面里有几张表、各多少行多少列,不导出文件否关
--demo用内置示例数据跑一遍,不需要网址也不需要联网否关

常见问题

Q:导出后用 Excel 打开中文是乱码?A:CSV 文件固定输出 UTF-8 带 BOM,这正是让 Excel 双击不乱码的关键——没有 BOM 的 UTF-8 中文 CSV,Excel 会按本地 ANSI 编码去猜从而显示乱码。如果仍然乱码,说明你的 Excel 版本较老,可以改用「数据 → 从文本/CSV 导入」并手动选 UTF-8。最省事的办法是直接用 -f xlsx 导出 Excel 格式,从根上避开编码问题。
Q:提示「没有找到 table 标签」是怎么回事?A:三种可能,按概率排序:一是页面的数据是 JavaScript 动态渲染出来的,本工具只解析服务器直接返回的静态 HTML,不执行脚本——这是最常见的原因;二是页面用 div + CSS 布局而不是表格标签,虽然看起来像表格但结构里没有 table;三是这个页面需要登录才能看到内容,未登录时返回的是登录页。你可以按 F12 打开开发者工具,搜索一下「table」关键字确认页面上到底有没有这个标签。
Q:抓到的表不对,抓到了一堆导航栏和页脚?A:那些是拿 table 做页面排版的「假表格」。先用 --list 看看页面里总共有几张表、各是什么尺寸和表头,找到真正的那张之后用 -n 精确指定,例如 -n 3 表示只要第 3 张。假表格通常很小(1 行或 1 列),工具默认已经过滤掉了一部分,但排版复杂的网站可能残留一些。
Q:表格里有合并单元格,导出后对吗?A:对,这是本工具的核心能力。网页里 rowspan=2 表示这个格子纵向占两行,导出后该格子的内容只出现在第一行,下面那一行对应的列留空——这正确反映了 Excel 里合并单元格的结构。如果把它填充到每一行反而会误导:你无法区分「原本就是合并的」和「两行数据恰好相同」。这也是手工复制粘贴做不到的地方,手工粘的时候下面所有列都会整体左移。
Q:为什么工具要先检查 robots.txt?A:robots.txt 是网站告诉爬虫哪些路径不要抓的约定文件,遵守它是网络爬虫的基本礼仪,也是《网络安全法》框架下合规使用数据的基本要求。本工具默认会先读一次 robots.txt,只有明确禁止该路径才会停止。检查原则是「拿不到就放行」——robots.txt 不存在在语义上就是无限制,所以 404 或超时都会允许继续。如果你确认有抓取该页面的正当授权,可以用隐藏参数 --no-robots 跳过检查。
Q:能批量抓很多个页面吗?A:当前版本是「一个网址一次」,刻意如此。批量抓取涉及请求频率控制、失败重试、断点续传、目标站点的压力等一系列问题,做成一个按钮反而容易误用——被滥用会给我们和用户都带来麻烦。如果你确实有批量抓公开数据的合规需求,可以通过页底的联系方式找我们做定制,我们会在加上并发限制和频率控制的前提下实现。
Q:exe 被杀毒软件拦截或提示「未知发布者」?A:这是未做代码签名认证的免费软件的正常现象。工具不联网(除了抓取你指定的那一个页面)、不写注册表、不需要管理员权限、不留后台进程。遇到提示时点「更多信息 → 仍要运行」即可;企业环境可以联系获取源码后自行编译并签名分发。
Q:会修改网页或者我本地的文件吗?A:都不会。对网页只做 GET 读取,不提交任何数据;本地只往你指定的输出目录(默认 table_output)里写新文件,不会碰任何已存在的文件。这一点是硬约束,源码里除了输出目录之外没有任何写操作。

技术实现与后续维护

本工具以零第三方依赖为核心约束开发,全部代码基于 Python 标准库实现,交付的完整工程可直接用 Python 3.8+ 独立编译,不需要任何私有依赖或额外配置。src/ 下是 1180 行带详细中文注释的源码,按功能分为五节;DOCS/开发文档.md 说明了整体数据流、10 个技术实现要点的设计取舍(含多处踩坑记录)、8 个扩展方向与维护约定。二次开发前强烈建议先读开发文档第 3 节「技术实现要点」,其中 3.2 节的 rowspan 占位网格算法和 3.5 节的 xlsx 六部件结构是整个工具最容易改坏的地方,那一节解释了为什么 _flush_row 里必须写 if row or occupied、为什么列为 1 基字母无零进制等关键决策,能避免改错方向。工程内附 build.bat 与 run.bat,分别用于一键编译和免编译调试;testdata/ 下三个文件覆盖了合并单元格、GBK 编码、无表格三种关键场景,改动后跑一遍即可回归。

技术构成:

  • src/web_table_export.py —— 唯一源码文件(1180 行),含详细中文注释,分五节:HTML 表格解析器 / 网络抓取与编码嗅探 / 表格规整与导出 / 示例数据与自检 / 命令行入口
  • DOCS/开发文档.md —— 开发文档:工程结构、数据流、10 个技术实现要点(含设计取舍与踩坑记录)、编译方式、8 个扩展点、维护约定、9 条自测用例
  • README.md —— 简版用法说明,含参数表、合并单元格处理原理、边界说明与常见问题
  • build.bat —— Windows 一键编译脚本:检查 Python 版本、按需安装 PyInstaller、编译单文件 exe 并自动自测
  • run.bat —— 开发期直接运行脚本,免编译快速调试
  • requirements.txt —— 依赖声明:运行期为无(纯标准库),编译期仅需 PyInstaller
  • testdata/ —— 自测数据:demo_page.html(含合并单元格)、gbk_page.html(GBK 编码,测嗅探)、no_table.html(测空结果分支)

运行环境:

Windows 下双击 build.bat 即可,脚本会自动检查 Python 版本、按需安装 PyInstaller、编译并自测。等价的手工命令:pip install pyinstaller 然后 pyinstaller --onefile --console --clean --noconfirm --name web_table_export --distpath dist_runtime --workpath build_temp src/web_table_export.py。产物是 dist_runtime/web_table_export.exe,单文件免安装,约 9 MB。开发期调试可双击 run.bat 直接运行源码。

可扩展方向:

  • 新增导出格式(Markdown 表格 / JSON / SQL INSERT):新增 write_xxx(),在 main() 的导出分支加 elif,并同步注册到 --format 的 choices
  • 表头加粗:_styles_xml() 里已预置 fontId=1 的加粗字体定义,只需在 _sheet_xml() 给第一行单元格加 s=1 属性即可
  • 多页抓取(翻页):新增 --pages N,循环调用 fetch_html() 并拼接 tables,注意在循环里 sleep 避免给对方服务器造成压力
  • 合并同结构的表:站点把长表拆成多页展示时,可在 pick_tables() 后加 merge_same_header() 把表头相同的表纵向拼接
  • 支持无表头表格:新增 --no-header,导出时不把第一行当表头,只跳过去重逻辑
  • 从本地文件读取:新增 --file 跳过网络直接读本地 HTML,便于处理「网页已保存到本地但表格难复制」的场景,也方便离线调试
  • 图形界面:用标准库 tkinter 包一层,输入框填 URL 点按钮出结果,fetch_html / TableCollector / pick_tables / write_* 四个环节可原样复用
  • 导出时保留原始 HTML:新增 --keep-html 把抓到的 HTML 存下来,便于用户核对「我看到的和工具解析到的是否一致」,排查问题非常有用

本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。

需要其它功能?可以定制

这个工具只做一件事:网页上有张数据表想存进 Excel,手工框选复制一遇到合并单元格就会串行错位。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。

常见的定制需求:

  • 批量抓取:给定一批网址和翻页规则,自动抓取并汇总成一张总表(含频率控制与失败重试)
  • 定时监控:每天定时抓某个公开榜单,自动记录排名变化并生成趋势对比表
  • 对接数据库:抓到的数据直接写入 MySQL / SQLite,省掉导出文件这一步
  • 增加数据清洗规则:导出前自动去重、合并同类项、按指定列排序、格式化数字
  • 支持需要登录的页面:按需增加 Cookie 或账号配置(仅限用户自有账号与授权数据)
  • 输出到在线表格:直接推送进企业微信智能表格、飞书多维表格或腾讯文档,避免手工导入
  • 加图形界面与批量任务队列,给不熟悉命令行的同事使用
  • 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
  • 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
  • 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护

使用说明与免责声明

本工具涉及数据采集,请在合法合规的前提下使用。
  • 本工具仅用于采集公开可见或你自身拥有权限的数据。
  • 请遵守目标网站的服务条款、robots 协议及《网络安全法》等相关法律法规。
  • 请合理控制请求频率,不要对目标站点造成访问压力。
  • 不得用于采集个人隐私、付费墙内容或任何受法律保护的非公开数据。
  • 因使用不当造成的后果由使用者自行承担;本工具不做数据二次分发。
免费下载公开网页表格导出 v1.0.0
平台:Windows 10/11 (64位)大小:7.8 MB版本:v1.0.0更新:
下载地址 ▾
解压后双击即可运行,无需安装任何运行环境,不联网、不上传数据。
分享到:

本文链接:https://www.biyeyuanma.cn/post/245.html

服务热线

加我微信

加我微信