Ordelio

网页表格保存为 CSV 文件

CSV 文件是所有电子表格和数据库都能读取的纯文本。将网页表格转成这种格式并不难,难点在于如何避免乱码、分隔符错误或前导零丢失。本文将介绍四种方法及其各自的适用场景与局限性。

1. 复制,粘贴到 Excel 中,然后另存为

选中表格并将其复制,粘贴到一个空白的 Excel 工作表中,接着使用“文件”菜单中的“另存为”命令,并将文件类型选择为 CSV UTF-8。

适用场景:手头正好开着 Excel,且只需要处理一次的小表格。

局限:如果选择了普通的 CSV 类型而不是 CSV UTF-8,Windows 编码范围之外的所有字符(重音符号、西里尔字母、中文)都会变成问号。Excel 还会写入你在 Windows 区域设置中配置的分隔符,因此在许多欧洲系统上,你以为的“逗号分隔”文件实际上会变成用分号分隔,导致后续读取的程序无法正确识别。此外,粘贴操作还可能会丢掉前导零(例如将 01234 变成 1234)并将 1-2 这样的数值误识别为日期,同时选区还可能会把表格周围的多余文字一并抓进去。

2. Google 表格:粘贴,然后下载

将表格粘贴到一个 Google 表格文件中,随后打开“文件”菜单,点击“下载”,并选择逗号分隔值 (.csv) 格式。

适用场景:任何配有浏览器的电脑,无需安装 Excel,且能确保文件始终为 UTF-8 编码。

局限:下载的文件总是使用逗号分隔。当你在小数点为逗号的地区双击打开它时,Excel 可能无法正确将其拆分为多列。下载范围仅限当前正在查看的工作表,而非整个文件。与 Excel 类似,Google 表格在粘贴时也可能会把某些数值自动转换为日期或数字。

3. Python:pandas.read_html

如果你平时就在使用 Python,可以通过 pandas 读取页面上的所有表格并将其写入 CSV:

pandas.read_html("https://example.com/page")[0].to_csv("table.csv", index=False)

方括号中的数字代表表格在页面上的位置(0 表示第一个)。使用此方法需要提前安装 pandas 和 lxml。

适用场景:需要编写脚本每周定时抓取同一个页面,或者需要批量抓取成百上千个页面。

局限:部分网站会返回 403 错误拒绝请求,因为脚本的访问特征不像真实浏览器,因此你可能需要先手动下载页面,再将 HTML 传入 pandas。它无法访问需要登录后才能查看的页面,也无法获取由 JavaScript 在页面加载后动态渲染出来的表格。脚注标记(如 [1])会保留在表头和数值中,并且一旦某列中存在缺失的单元格,整列的整数就可能会变成带小数点的格式(例如 8021407192.0)。

4. 浏览器扩展:在你正在阅读的页面上一键搞定

扩展程序可以直接在浏览器当前显示的页面上运行,因此它同样适用于需要登录的页面以及通过 JavaScript 构建的表格。我们开发了一款这样的工具——Ordelio 表格复制(免费且无行数限制):

  1. 打开页面并点击扩展图标(或按下 Alt+Shift+Y)。它会列出页面上的所有表格,面积最大的排在最前面;将鼠标悬停在上方即可高亮显示。
  2. 点击 CSV:浏览器便会直接将包含该表格的文件保存下来。中文等字符不会乱码,因为文件采用的是带有字节顺序标记(BOM)的 UTF-8 编码,以便 Excel 能够正确识别;并且如果你的系统语言使用逗号作为小数点,分隔符会自动设为分号(你也可以在选项中强制使用逗号、分号或制表符)。

它还会自动移除诸如 [1] 的脚注标记,重复合并的单元格以保持各列对齐,并将如 01234 这样的代码原封不动地写入文件,与页面上显示的一致(打开文件的电子表格程序可能仍会将其转为数字)。

局限:它保存的是页面当前的内容,因此跨越多页的表格需要逐页保存,且无法像脚本那样实现文件的自动更新。

获取适用于 Microsoft Edge 的 Ordelio 表格复制 Chrome 和 Firefox 版本:正在审核中。

该选哪种方法

Excel 另存为Google 表格pandas扩展程序
需要登录的页面可以(通过复制)可以(通过复制)不行可以
字符不会乱码仅限 CSV UTF-8可以可以可以
可自定义分隔符不行(由 Windows 决定)不行(固定为逗号)可以(通过参数)可以(通过选项)
一次抓取上百个页面不行不行可以不行
获取一个新页面的时间大约一分钟大约一分钟初次需要几分钟几秒钟

简而言之:对于需要在公开页面上每周运行一次的脚本,请使用 pandas。对于你正在阅读的页面上临时产生的小需求(尤其是需要登录的页面),直接从页面上保存即可。

遇到以上所有方法都无法处理的表格?告诉我们,我们会认真阅读每一条留言。