适用人群
网页表格转成 Markdown,一路不散架
通用的 HTML 转 Markdown 转换器,偏偏在最要紧的表格上出错:单元格里带列表、链接或代码示例的那种。Clean Web Clipper 自己序列化表格,把单元格内容压平,而不是丢掉整行。
数字在哪一步丢了
你保存这个页面,就是为了那张表:价格档位、调用频率限制、数据保留期、数据结构定义。把剪藏粘进笔记,却发现一行被摊成了一整页,竖线位置全乱,还有一列悄悄和旁边那列并在了一起。原始数字还在身后的浏览器里,所以这种错误很容易被忽略,直到那个标签页被关掉。
反方向的错误同样要耗掉一个下午。很多网站仍然只是拿 table 来排版,一个把所有表格都当数据处理的转换器,会塞给你二十行伪装成数据集的导航。一种结果是花时间重敲数字,另一种是花时间删网格,哪一种都不是你坐下来要做的分析。
手工重敲还有第三种代价,要很久以后才显现。手敲进表格的数字不带来源、不带日期,也无从核对:六周后,没人说得清 D14 单元格里的数据保留期是一月还是三月从页面上抄来的,而页面此后又改过两次。价格、频率限制和配额的变动往往不会公告。表格上方带着来源网址和页面声明日期的剪藏,能回答这个问题;下个季度你再剪藏同一页面、比较两个文件时,它还能再回答一次。
哪些内容能完整转过来
- 专门为此编写的 GFM 表格序列化器,而不是给通用转换器外挂的插件。
- 技术语料上 15 个表格保住 12 个,参与对比的每个引擎各保住 7 个。
- 参差不齐的两列表格 转成加粗的键和值,而不是一张散架的网格。
- 排版用的表格会被拆开:只用于定位的网格交出其中的内容,网格本身不保留。
- 单元格里的代码仍然是代码,代码块带着语言标记。
- 在页面上选中表格,只剪藏选中内容,适合用不到周围文章的时候。
- 来源网址和页面声明的日期写在表格上方,一组数字带着它有效的日期,而不是你碰巧归档的日期。
- 同一页面的第二次剪藏加数字后缀,从不覆盖:正因如此,按季度做 diff 才成为可能。
--- title: "中华人民共和国2024年国民经济和社会发展统计公报" source: "https://www.stats.gov.cn/sj/zxfb/202502/t20250228_1958817.html" date: "2025-02-28" extraction: "dom" --- 表2 2024年居民消费价格比上年涨跌幅度 单位:% | 指标 | 全国 | 城市 | 农村 | | --- | --- | --- | --- | | 居民消费价格 | 0.2 | 0.2 | 0.3 | | 其中:食品烟酒 | -0.1 | -0.1 | -0.1 | | 衣着 | 1.4 | 1.6 | 0.9 | | 居住 | 0.1 | 0.1 | 0.1 | | 生活用品及服务 | 0.5 | 0.4 | 0.8 | | 交通通信 | -1.9 | -2.0 | -1.5 | | 教育文化娱乐 | 1.5 | 1.5 | 1.6 | | 医疗保健 | 1.3 | 1.2 | 1.5 | | 其他用品及服务 | 3.8 | 3.8 | 3.6 |
为表格做好设置
两项设置,加一个习惯。这个习惯(剪藏前先滚动到底)能找回的行,比任何设置都多。
- 点击扩展程序图标打开 设置,把保存位置指向工作数据所在的文件夹,例如放在使用这些数据的 notebook 或表格文件旁边的
data/sources。 - 把点击图标保持为 打开窗口。表格是唯一值得在归档前看一眼的东西:列有没有对齐,在窗口里一眼可见,在文件列表里却完全看不出来。
- 把文件名模板设为
{date}-{domain}-{title},这样一月和四月保存的同一个价格页面会是两个文件,而且排在一起。 - 在 frontmatter 中打开
source和date。一张不带来源网址的表格,就是一组迟早有人得重新推算的数字。 - 剪藏前,把表格滚动到最底部。随滚动加载的行在加载之前并不存在于 DOM 中,而扩展程序读取的是你剪藏那一刻的 DOM。
- 如果周围的文章用不上,就在页面上选中表格,只剪藏选中内容。窗口顶部的开关会确认你看到的是选中内容,而不是整个页面。
- 为数字会变动的页面在日历里设一个定期剪藏:配额、价格、数据保留期。这批资料的价值在第二次剪藏,而不在第一次。
要反复使用的数字,这样设置
下面每一个值的目的都一样:六个月后再读这张表,它仍然说得清自己从哪里来、是什么时候的数据。
| 设置 | 值 | 为什么在这里用这个值 |
|---|---|---|
| 点击图标时 | 打开窗口 | 列错位一眼就能看出,放进文件列表里就看不见了 |
| 保存位置 | 文件夹 `data/sources` | 让剪藏和使用它们的 notebook 或表格文件放在一起 |
| 文件名模板 | `{date}-{domain}-{title}` | 同一页面的季度剪藏排在一起,而且永不重名 |
| 属性(frontmatter) | 打开 `source` 和 `date` | 这两行能把一组数字重新变成可引用的事实 |
| 图片 | 跳过 | 图表无论如何都只是图片链接,扩展程序不会从图片里读数字 |
| 选中内容 | 选中表格,只剪藏选中内容 | 一篇十二屏长的文章围着一张四行的表,放进数据文件夹就是噪音 |
| 重复剪藏 | 每个季度剪藏同一页面 | 数字后缀让两份都留下,diff 本身就是分析 |
**Content-Type** : 资源的媒体类型。每个带请求体的请求都必须提供。 **Cache-Control** : 请求和响应中用于缓存机制的指令。 **Retry-After** : 以秒为单位的延迟,或一个 HTTP 日期,表示在此之后重试。 原网格的表头有合并单元格,最后一行里还嵌着一个列表。 照搬成 Markdown 表格会散架,转成键值对则不会。
三张表,三种结果
把价格表放进对比表格
四家供应商,四个价格页面,剪藏四次。每张表都转成 GFM 表格,套餐名、金额和限额都在原来的单元格里,上方带着来源网址,于是整张对比表拼好了,一个数字都没有重敲。
序列化器正是在这里派上用场:让通用转换器出错的,恰恰是带脚注标记、带功能列表或带代码示例的单元格。在 15 个表格的技术语料上,这里保住了 12 个,参与对比的每个引擎各保住 7 个。
同一页面,相隔一个季度
你在二月和五月各剪藏了一次某服务商的调用频率限制。第二个文件加了数字后缀。diff 显示,入门套餐的突发额度减半,最高档套餐的数据保留期延长,而这两项变化都没有在任何地方公告。
没有二月的文件,这个变化就无法证明,因为页面只显示当前状态,此前的数字在供应商公开的任何地方都找不到了。整个方法的前提,是第一次剪藏足够便宜,便宜到你在知道它重要之前就已经存下了。
一张没法当表格的网格
一个规范页面用两列网格定义了二十个请求头,表头有合并单元格,其中一行还嵌着列表。照搬成 Markdown 表格会塌掉;实际转出来的是加粗的键,值在下面,无论阅读还是搜索都没有损失。
这是有意的设计,而不是退而求其次的失败。参差不齐的两列表格,更多时候是套着网格外衣的定义列表,而不是数据;修一张散架的竖线表格,比读一份列表费劲得多。
和常见的搬表格方法比
这些方法都能把数字从页面上弄下来。区别在于数字带着什么一起过来,以及之后你还得做什么。
| 现在的做法 | 得到什么 | 代价是什么 |
|---|---|---|
| 手工重敲进表格 | 正好是你要的那些单元格 | 抄写错误,而且没有来源和日期的记录 |
| 复制粘贴进电子表格 | 经常能得到网格,但不总是 | 单元格里有列表或代码时就出错,排版网格也会被当成数据 |
| 给表格截图 | 表格显示的样子 | 无法计算、无法搜索,也没有来源说明 |
| 网站自带的 CSV 导出 | 干净的数据,前提是有 | 大多数页面不提供,而且导出的内容有时和页面显示的不一致 |
| 通用的 HTML 转 Markdown 转换器 | Markdown,而且快 | 单元格里有列表或代码块,正是通用转换器出错的地方 |
| Clean Web Clipper | 一张 GFM 表格,上方带来源和日期 | 没有合并单元格,不导出 CSV,也不从图表图片里读数字 |
表格转得不对时
合并单元格没了
Markdown 没有合并单元格,所以 colspan 和 rowspan 会被压平:内容保留,视觉上的合并不保留,因为这种格式表达不了。原本横跨三列的表头,文字会落在其中第一列。这是目标格式的特性,而不是转换的问题,任何 Markdown 表格都表达不了合并。
少了一半的行
扩展程序读取的是你剪藏那一刻的 DOM,所以随滚动加载的行(或者藏在“显示更多”按钮后面、分页显示的行),只要你没让它们加载出来,就还不存在。先滚动到底,展开能展开的,再剪藏。分页的表格,每一页剪藏一次,之后再合并;浏览器从未收到的行,没有别的办法能找回。
得到的是一张导航网格,不是数据
那是排版表格:纯粹用于定位的网格,许多老网站仍用它来做菜单和页头。这类表格会被拆开而不是转换,内容保留,网格不保留。如果导航网格还是以表格形式进了笔记,那是因为页面把它标记成了数据表格:标记说“这是数据”,扩展程序就照此处理。
表格变成了键和值
这是参差不齐的两列表格的处理路径。行不整齐的两列表格,通常是画成网格的定义列表,照搬成竖线表格只会得到一张散架的网格,而不是一张可读的表。内容是完整的:加粗的键,值在下面,顺序和原文一致。如果确实需要真正的表格,这些键值对可以机械地转回去。
格式本身的边界
Markdown 没有合并单元格,所以 colspan 和 rowspan 会被压平:内容保留,视觉上的合并不保留,因为这种格式表达不了。嵌在单元格里的表格对所有工具都是难题,这个也不例外。它不会从图表图片里读出数字,也不导出 CSV 或 XLSX,输出就是 Markdown。而且它一次只转换一个页面:你当前所在的那个页面。
常见问题
只用来排版的表格会怎样处理?
支持合并单元格吗?
能只剪藏表格吗?
能导出 CSV 吗?
滚动时才加载更多行的表格怎么办?
能从图表里读出数字吗?
文件会记录这些数字是哪天有效的吗?
{date} 写进文件名。如果页面没有声明日期,字段就留空而不是填上一个值,至少这是一个诚实的空白,而不是一个错误的数字。