適用對象
轉換成 Markdown 後依然完整的表格
通用的 HTML 轉 Markdown 工具,偏偏在重要的表格上出錯:儲存格裡有清單、連結或程式碼範例的表格。Clean Web Clipper 自己序列化表格,把儲存格內容攤平,而不是丟掉那一列。
數字在哪裡弄丟
表格正是你存下這個頁面的原因:價格方案、速率限制、保存期限、資料結構描述。你把擷取內容貼進筆記,發現一列資料攤開成一整頁、直線符號出現在錯誤的位置,還有一欄悄悄和隔壁欄合併了。數字仍然在你身後的瀏覽器畫面上,所以這種失敗很容易被忽略,直到分頁關掉為止。
相反的失敗,也要花掉同樣一個下午。很多網站仍然只把 table 用來排版,把每一個都當成資料的轉換器,會交給你二十列偽裝成資料集的導覽。一種結果是花時間重打數字,另一種是刪掉一整個網格,而兩者都不是你坐下來要做的分析。
重打還有第三種代價,很久以後才會顯現。手動打進試算表的數字,沒有來源、沒有日期,也無從查核:六週後,沒人說得出儲存格 D14 中的保存期限是一月還是三月從頁面讀來的,而頁面在那之後已經改過兩次。價格、速率限制和配額會在沒有公告的情況下改變。上方附有來源網址和頁面宣告日期的擷取表格,能回答這個問題,下一季你再擷取同一個頁面並比對兩者時,也能再回答一次。
完整保留下來的東西
- 專為此撰寫的 GFM 表格序列化程式,而不是外掛上去的通用轉換器。
- 15 個表格保留 12 個(技術語料),比較的引擎各保留 7 個。
- 參差不齊的兩欄表格會變成粗體的鍵和值的行,而不是崩壞的網格。
- 版面表格會被拆開:只用來排版的網格,會交出內容而不保留網格。
- 儲存格中的程式碼仍是程式碼,程式碼區塊帶有語言標籤。
- 在頁面上選取表格並擷取選取範圍,不需要周圍的文章時就這麼做。
- 來源網址和頁面宣告的日期放在表格上方,所以一組數字帶著它有效的日期,而不是你碰巧歸檔的日期。
- 同一頁面的第二次擷取加上數字後綴,絕不覆寫;每季的差異比對因此才做得到。
| Storage class | Meaning | | ------------- | ------------------------------------------------------ | | `NULL` | The value is a NULL value. | | `INTEGER` | A signed integer, stored in 1, 2, 3, 4, 6 or 8 bytes. | | `REAL` | A floating point value, stored as an 8-byte IEEE number.| | `TEXT` | A text string, stored using UTF-8, UTF-16BE or UTF-16LE.| | `BLOB` | A blob of data, stored exactly as it was input. |
為表格設定擷取
兩項設定和一個習慣。這個習慣,也就是擷取前先捲動,救回的列數比任何設定都多。
- 從擴充功能圖示開啟選項,把存放位置指向工作資料所在的資料夾:使用這些資料的筆記本或試算表旁邊的
data/sources。 - 把按下圖示的動作保留為預覽視窗。表格是唯一值得在歸檔前看一眼的東西:欄位有沒有對齊,一眼就看得出來,放進資料夾清單裡就看不見了。
- 把檔名範本設為
{date}-{domain}-{title},這樣一月和四月擷取的同一個價格頁面,會是兩個排在一起的檔案。 - 在 frontmatter 中開啟
source和date。沒有來源網址的表格,只是一組遲早有人得重新推導的數字。 - 擷取前,先捲到表格底部。捲動時才載入的列,載入之前並不存在於 DOM 中,而擴充功能讀取的是擷取那一刻的 DOM。
- 不需要周圍的文章時,在頁面上選取表格並擷取選取範圍。視窗頂端的切換鈕會確認你看的是選取範圍,而不是整頁。
- 為數字會變的頁面在行事曆上排定定期擷取:配額、價格、保存期限。這批資料的價值在第二次擷取,而不是第一次。
會重複使用的數字的設定
下面每一個值的目的,都是讓六個月後讀到的表格,仍然說得出它從哪裡來、是什麼時候的。
| 設定 | 值 | 為什麼在這裡用這個值 |
|---|---|---|
| 按下圖示 | 預覽視窗 | 欄位錯位一眼就看得出來,在檔案清單中卻看不見 |
| 存放位置 | `data/sources` 資料夾 | 讓擷取內容和使用它們的筆記本或試算表放在一起 |
| 檔名範本 | `{date}-{domain}-{title}` | 同一頁面的每季擷取會排在一起,而且絕不撞名 |
| Frontmatter | 開啟 `source` 和 `date` | 這兩行能把一組數字變回可引用的事實 |
| 圖片 | 略過 | 圖表無論如何都只會是圖片連結;擴充功能不會從圖片中讀出數字 |
| 選取範圍 | 選取表格,擷取選取範圍 | 四列表格外面包著十二個畫面的文章,在資料資料夾裡就是雜訊 |
| 重複擷取 | 每季擷取同一個頁面 | 數字後綴會保留兩份,而差異比對就是分析本身 |
**Content-Type** : The media type of the resource. Required on every request with a body. **Cache-Control** : Directives for caching mechanisms in both requests and responses. **Retry-After** : Either a delay in seconds or an HTTP-date after which to retry. 來源網格有合併的標題儲存格,最後一列還有巢狀清單。 重建成 Markdown 表格就會壞掉;改成成對的鍵與值就不會。
三張表格,三種結果
把價格表放進比較試算表
四家廠商、四個價格頁面、四次擷取。每張表格都以 GFM 表格呈現,方案名稱、金額和限制都在原本的儲存格裡,上方附有來源網址,所以比較試算表組起來時,沒有任何一個數字需要重打。
序列化程式正是在這裡發揮作用:會讓通用轉換器出錯的儲存格,就是裡面有註腳標記、功能清單或程式碼範例的那些。在包含十五個表格的技術語料上,這裡保留了十二個表格,比較的引擎各保留七個。
同一個頁面,相隔一季
你在二月和五月各擷取了一次某個供應商的速率限制。第二個檔案加上了數字後綴。差異比對顯示,入門方案的突發額度減半,最高方案的保存期限則延長了,而這兩件事都沒有在任何地方公告。
沒有二月的檔案,這個改變就無法證明,因為頁面只顯示目前的狀態,先前的數字也不存在於廠商公布的任何地方。整個方法依賴的是:在你知道它重要之前,第一次擷取就已經便宜到可以順手做。
無法成為表格的網格
一個規格頁面在兩欄網格中定義了二十個標頭,標題儲存格有合併,其中一列還有巢狀清單。重建成 Markdown 表格就會崩壞;它改為以粗體的鍵行和下方的值呈現,閱讀和搜尋時都沒有任何損失。
這個行為是刻意設計的,而不是失敗後的退路。參差不齊的兩欄表格,往往是披著網格外衣的定義清單,而不是資料;崩壞的直線表格比清單更難修復,清單卻很好讀。
和一般搬移表格的方式相比
以下每一種都能把數字從頁面上拿下來。差別在於數字帶來了什麼,以及你之後還得做什麼。
| 目前的做法 | 你得到什麼 | 代價是什麼 |
|---|---|---|
| 重打進試算表 | 正好是你需要的儲存格 | 抄寫錯誤,而且沒有來源或日期的紀錄 |
| 複製貼上到試算表 | 常常能得到網格,有時不行 | 儲存格中有清單或程式碼時會失敗;版面網格會被當成資料 |
| 截圖表格 | 表格顯示的樣子 | 無法計算、無法搜尋,也沒有來源行 |
| 網站自己的 CSV 匯出 | 乾淨的資料,如果有的話 | 大多數頁面沒有提供,而且匯出內容有時和顯示的不同 |
| 通用的 HTML 轉 Markdown 工具 | 快速得到 Markdown | 儲存格中有清單或程式碼區塊時,通用轉換器就會出錯 |
| Clean Web Clipper | 上方附有來源和日期的 GFM 表格 | 沒有合併儲存格、沒有 CSV 匯出,也不會從圖表圖片中讀出數字 |
表格結果不對的時候
合併儲存格不見了
Markdown 沒有合併儲存格,所以 colspan 和 rowspan 會被攤平:內容保留,視覺上的合併不保留,因為這種格式無法表達。原本橫跨三欄的合併標題,文字會落在第一欄。這是目標格式的特性,而不是轉換的問題,任何地方的 Markdown 表格都無法表達它。
一半的列不見了
擴充功能讀取的是你擷取那一瞬間的 DOM,所以頁面在你捲動時才載入的列(或透過「顯示更多」按鈕提供、或分頁顯示的列),除非你讓它們出現,否則根本還不存在。捲到底、展開能展開的部分,再擷取。分頁顯示的表格,就每一頁各擷取一次:各部分之後可以合併,而瀏覽器從未收到的列,沒有任何方法能救回。
我拿到的是導覽網格,不是資料
那是版面表格:純粹用來排版的網格,許多舊網站仍用它來做選單和頁首。這種表格會被拆開而不是被轉換,所以內容會保留,網格則不會。如果導覽網格真的以表格形式進了筆記,那是因為頁面把它標記成資料表格:標記說它是「資料」,擴充功能就相信了。
表格變成了鍵與值的行
這是參差不齊兩欄表格的處理路徑。列數不整齊的兩欄表格,通常是畫成網格的定義清單,重建成直線表格只會得到崩壞的網格,而不是可讀的表格。內容是完整的:粗體的鍵,下方是值,依原本的順序排列。如果你需要真正的表格,這些成對的內容可以機械式地轉回去。
格式的極限
Markdown 沒有合併儲存格,所以 colspan 和 rowspan 會被攤平:內容保留,視覺上的合併不保留,因為這種格式無法表達。巢狀在儲存格內的表格對任何工具都很難,這個工具也不例外。它不會從圖表圖片中讀出數字,也不匯出 CSV 或 XLSX。輸出是 Markdown。它一次轉換一頁,就是你正在看的那一頁。
常見問題
純粹用來排版的表格會怎樣?
支援合併儲存格嗎?
可以只擷取表格嗎?
可以從中取得 CSV 嗎?
捲動時才載入更多列的表格呢?
它能從圖表中讀出數字嗎?
檔案會記錄這些數字是什麼時候有效的嗎?
{date} 放進檔名。頁面沒有宣告日期時,欄位會留空而不是被填上,這至少是誠實的缺口,而不是錯誤的數字。