Clean Web Clipper 加到 Chrome(免費)

適用對象

把 API 文件存成 Markdown,程式碼完整保留

Clean Web Clipper 從頁面上讀取語言:來自程式碼區塊的 class、父元素,或語法醒目提示工具自己的標記,並把它寫進程式碼區塊。在一份九個頁面的技術語料上,語言標籤在 156 個程式碼區塊中保留了 73 個,比較的兩個引擎分別是 20 個和 0 個。

為什麼擷取下來的文件還得整理

文件大部分是程式碼,而程式碼正是多數擷取工具會弄丟的部分。你把一頁框架文件或一個之後還會用到的答案存下來,貼進筆記,結果每個程式碼區塊都沒有標籤:沒有 js、沒有 bash、沒有 sql。顏色不見了,一眼分辨 shell 指令和 JSON 內容的最快方法也跟著不見。

其餘的損害是結構上的。儲存格裡有程式碼範例的表格,會擠成一行。版本選擇器和「本頁內容」側欄跑到文章中間。程式碼元件外層的 div 包裝以原始標記的形式留下來。手動修好這些,比憑記憶重寫筆記還花時間,所以大多數人乾脆不再擷取文件,只是讓分頁一直開著,直到內容過時。

分頁本身就是第三個問題。文件有版本,網址通常沒有:你為 v4 讀的頁面悄悄變成 v6,旗標改了名、選項被移除,書籤卻仍然打得開,只是內容已經不同。你的筆記裡沒有任何東西記錄你實際依據的是哪個版本。檔頭帶有網址和頁面自身日期的檔案,一年後還能回答這個問題;書籤從來做不到。

筆記裡改為留下什麼

程式碼區塊保留語言標籤react.dev/learn/thinking-in-react
The JSON API returns some data that looks like this:

```js
[
  { category: "Fruits", price: "$1", stocked: true, name: "Apple" },
  { category: "Vegetables", price: "$2", stocked: true, name: "Spinach" }
]
```

## Step 1: Break the UI into a component hierarchy

為文件設定擷取

花六分鐘設定一次,之後快速鍵會處理其餘的事。預設值是為閱讀文章調整的;文件需要不同的檔名、不需要作者欄位,也不需要圖片。

  1. 安裝擴充功能並把圖示釘選到工具列。在圖示上按右鍵,選擇選項,在分頁中開啟設定。
  2. 按下圖示時的動作設為「存到資料夾」。這樣一次擷取就只是一個按鍵,沒有視窗擋路。預覽視窗在你熟悉工具時很有用,之後就只會礙事。
  3. 選擇資料夾。指向你已經納入版本控制的目錄,例如你正在開發的儲存庫中的 docs/clips。瀏覽器會詢問確認一次,並記住該設定檔的授權。
  4. 把檔名範本設為 {domain}-{title}。四個框架都有一頁叫「Getting started」,檔名裡沒有網域的話,第四個就會悄悄變成 getting-started-4
  5. 在 frontmatter 區段保留 sourceextraction,關閉 author。文件很少署名,每個檔案裡都有一個空欄位只是雜訊,最後你還得把它刪掉。
  6. 把圖片設為略過。別人 IDE 的螢幕截圖無法搜尋,而圖片連結指向的 CDN 遲早會搬家。
  7. 開啟 chrome://extensions/shortcuts,確認 Alt+Shift+M 已經綁定。如果被其他擴充功能占用,就在這裡搶回來。

適合開發者的設定

這些是值得從預設值改掉的設定,以及每一項為什麼特別對文件重要,而不只是對一般閱讀重要。

設定為什麼在這裡用這個值
按下圖示存到資料夾一天擷取二十次的東西,不該開二十次視窗
資料夾儲存庫中的 `docs/clips`擷取內容能用和程式碼相同的工具做版本控制、審查和搜尋
檔名範本`{domain}-{title}`框架文件的標題會撞名,網域不會
圖片略過螢幕截圖無法 grep,而且圖片網址比文字更快失效
Frontmatter開啟 `source` 和 `extraction`,關閉 `author`你需要網址和擷取路徑;文件頁面沒有值得保留的署名
個別網站規則`reddit.com` → 子資料夾 `threads`論壇解答和官方文件過時的方式不同,值得分開存放
快速鍵`Alt+Shift+M`手不離鍵盤就能擷取,是會去做和不會去做之間的差別
頁面上沒有 class,程式碼區塊就沒有標籤範例由手動排版的文件頁面
Run the migration before starting the server:

```
./bin/migrate --env production
```

```sql
SELECT id, created_at FROM sessions WHERE expires_at < now();
```

第二個區塊帶有 `class="language-sql"`。第一個什麼都沒有,
所以保持沒有標籤,而不是標上猜測的語言。

三段實際工作

鎖定你實際依據的版本

你在看某個框架 v4 分支的文件,讀到一個在 v5 被改名的設定旗標。你按下 Alt+Shift+M。檔案以 example-dev-configuration-reference.md 存進 docs/clipssource 指向 /v4/ 網址,檔頭帶有頁面宣告的日期。

八個月後,這個旗標在正式環境中的行為變了,沒有人記得當初為什麼這樣設定。擷取內容就在儲存庫裡,和那次變更位於同一段提交範圍內,它說明了這個決定是依據哪個版本的文件做的。線上網址現在提供的是 v6,已經完全沒提到這個旗標。

真正解決問題的論壇討論串

官方文件描述的是理想情況;你的狀況的解法在一個 Reddit 討論串裡,往下四層留言,被採納的答案有 140 分,排在一個只有 30 分的錯誤答案下面。你擷取這個討論串。個別網站規則把它送進 threads,留言結構以巢狀引用區塊呈現,每則都附上分數。

回頭再讀時,分數才是重點。直接複製貼上的扁平版本會完全失去排序訊號,你只能重讀五種意見,卻無從得知社群認同哪一個。

一張變數表格,直接放進 pull request

部署指南裡有一張包含十八個環境變數的表格,其中三個儲存格含有程式碼範例。你在頁面上選取表格,擷取選取範圍,把 Markdown 貼進 pull request 說明。GitHub 會把它顯示為表格,因為它是 GFM 表格,不是螢幕截圖。

在包含十五個表格的技術語料上,這個序列化程式保留了十二個表格,比較的引擎各保留七個。會讓通用轉換器出錯的,正是這種儲存格:裡面有程式碼或清單的儲存格。

和常見做法相比

以下每一種都行得通,而且每一種都是你團隊裡有人正在用的方法。第三欄是誠實的代價,包括這個擴充功能在內。

目前的做法你得到什麼代價是什麼
讓分頁一直開著頁面原封不動下次重新啟動就關掉了,文件版本也會在你不知情時更新
複製貼上到編輯器文字,有時連側欄一起程式碼區塊沒有標籤,表格擠成一行
列印成 PDF頁面的固定版面副本無法用 `grep` 搜尋、無法比對差異,還附帶 Cookie 橫幅
加入書籤一鍵得到一個指標指標指向的是頁面今天的內容
其他擷取擴充功能Markdown,但刪減較少109 頁逐頁比較中有 282 到 491 行重複選單,這裡是 102 行
Clean Web Clipper帶有語言標籤的程式碼區塊和來源檔頭的 Markdown一次一頁,沒有爬蟲,不下載圖片

結果不對的時候

為什麼我的程式碼區塊沒有標籤?

因為頁面沒有說明它是什麼語言。Clean Web Clipper 從網站自己的語法醒目提示工具留下的 class 讀取語言;它不會看程式碼來猜。沒有 class、手動排版的範例會產生沒有標籤的區塊,這是誠實的結果。在 shell 片段上猜錯成 python 標籤比沒有標籤更糟,因為醒目提示會信心滿滿地把錯的東西上色。

為什麼指南少了一半?

幾乎都是分頁標籤或摺疊區塊造成的。擴充功能轉換的是瀏覽器實際呈現的內容,而點擊後才插入內容的分頁標籤,在你點擊之前並不在 DOM 裡。先打開分頁標籤、展開區段,再擷取;或者每個版本各擷取一次。如果網站會呈現所有分頁標籤、只用 CSS 隱藏,它們全都會依序被擷取下來。

為什麼它說沒有文章?

API 測試介面、搜尋結果頁或套件索引大多是連結文字,擴充功能會刻意拒絕這類頁面:如果擷取出的字元有超過約四分之一位於連結中,它會回報「沒有文章」,而不是交給你三百個項目。這種拒絕,也是它的「有用文字」得分低於那些總會傳回點什麼的引擎的原因。

我的檔案裡 extraction: "jsonld-articlebody" 是什麼意思?

代表頁面把文章文字放在結構化資料中,卻始終沒有把它呈現到 DOM 裡,所以內文改從結構化資料讀取。它會被記錄下來而不是隱藏,因為兩條路徑的內容可能不同:結構化資料中的副本有時是較早的草稿,有時卻是唯一完整的版本。看到這個值時,在依賴這段文字之前,值得先看一眼原始頁面。

它不做的事

它不會爬取文件網站:一次一頁,就是你正在看的那一頁。它不會下載圖片、圖表或其他二進位資源:圖片連結仍然指向原始網站。它不會替沒有標籤的程式碼區塊猜測語言,所以語法醒目提示工具沒有留下 class 的頁面,會產生沒有標籤的區塊,而不是標錯的區塊。在沒有文章內文的頁面上,例如 API 測試介面或搜尋結果頁,它會回報「沒有文章」,而不是交給你三百個連結。

加到 Chrome(免費)完全免費。不需要帳號、不需要註冊,也沒有任何限制。

常見問題

它能偵測哪些語言?
頁面本身宣告的任何語言。Clean Web Clipper 不會從程式碼推斷語言。它讀取網站自己的語法醒目提示工具留下的 class,所以標籤的正確程度和來源頁面完全一樣。
在用 JavaScript 呈現的文件上能用嗎?
可以。擴充功能在頁面呈現完成後讀取 DOM,所以單頁式文件網站會照你看到的樣子擷取下來。
行號會跑進程式碼區塊裡嗎?
網站把行號呈現為獨立元素時不會,大多數語法醒目提示工具都是這樣做的。行號本身就是程式碼文字的一部分時,它們會被帶進來,因為沒有任何東西能把它們和程式碼區分開。
可以從開發者文件中移除圖片嗎?
可以:把圖片設為「略過」,可以全域設定,也可以作為某個網站的規則。
可以一次擷取整個文件網站嗎?
不行。沒有爬蟲,也沒有批次模式:你一次擷取一個你真正需要的頁面。
在需要 SSO 登入的內部 wiki 上能用嗎?
可以。擴充功能讀取的是瀏覽器已經為你的工作階段呈現的頁面,所以登入後你看得到的任何內容,擷取起來都和公開頁面一樣。頁面的文字和標題絕不會離開你的電腦,成功擷取的頁面完整網址也不會。除非你在設定中關閉,否則會送出的是:成功擷取的網域本身(wiki.yourcompany.com,而不是那個頁面)、轉換失敗的頁面網址、你開啟了擴充功能的哪些畫面,以及一組隨機安裝編號。區域網路上的網址,例如 localhost、.local 名稱、10.x、192.168.x,永遠不會被送出。
可以把擷取內容放進 git 嗎?
這正是它們的用途。它們是帶有 YAML 檔頭的 UTF-8 文字檔,所以能逐行比對差異、像原始碼一樣合併,在儲存庫中幾乎不占空間。下一個版本發布時再擷取同一個參考頁面,差異就會顯示廠商改了哪些段落。
它能在哪些瀏覽器中執行?
Chrome 和其他 Chromium 瀏覽器:Edge、Brave、Vivaldi 和 Opera。它是 Manifest V3 擴充功能,不會在你閱讀的網站上要求任何權限,所以只能讀取你按下圖示或快速鍵的那個分頁。
為什麼在 `chrome://` 頁面上沒有任何反應?
瀏覽器禁止擴充功能在那裡執行,擴充功能商店本身也一樣。這是瀏覽器的規則,不是設定:沒有任何擴充功能能讀取那些頁面。
擷取一次要多久?
一般文件頁面只要幾十毫秒。帶有數百個參考連結的超長頁面需要幾百毫秒,因為註腳必須在清理程式移除它們所依賴的 id 之前收集完成。測得的時間會顯示在擷取視窗的角落。