· 6 分鐘閱讀
2026 Arc 轉 Chrome 書籤遷移指南:匯出 Pinned Tabs 與 Spaces(附 AI 提示詞一鍵複製)
Arc 沒有書籤匯出,Chrome 也不能直接匯入 Arc。這篇說明怎麼把 Arc 的 Pinned Tabs、Spaces、Favorites 從 StorableSidebar.json 轉成書籤 HTML 匯入 Chrome,附可直接複製的 AI 提示詞和 Python 腳本。
我今天把 Arc 的書籤搬到 Chrome,做法是讓 Claude Code 讀 Arc 的側邊欄檔案,寫一支約 40 行的 Python 腳本,轉成 Chrome 看得懂的書籤 HTML 再匯入。結果是 270 個連結、40 個資料夾,資料夾層級全部保留。整個過程只讀 Arc 的檔案,不改任何東西。
懶得看細節的話,直接複製下面的提示詞,貼進 Claude Code 或 Codex 就好。後面的段落是給想知道它在做什麼、或想自己動手的人。
一鍵複製:Arc 書籤轉 Chrome 的 AI 提示詞
我要把 Arc 瀏覽器的書籤(Pinned Tabs、Spaces、Favorites)遷移到 Chrome。這台是 macOS。
請照這個順序做:
1. 讀 ~/Library/Application Support/Arc/StorableSidebar.json,先檢查它的結構再動手。資料在 sidebar.containers[1],裡面的 items、spaces、topAppsContainerIDs 都是「id 字串、物件」交錯排列的陣列,只取物件。
2. 寫一支只讀不寫的 Python 腳本(只用標準函式庫),不要修改、移動或複製 Arc 的任何檔案。
3. 每個 Space 的 containerIDs 長得像 ["pinned", <id>, "unpinned", <id>],只取 pinned 那一個;unpinned 是臨時分頁,不要轉。Favorites 來自 topAppsContainerIDs。
4. 依 childrenIds 遞迴還原整棵樹:data 是 tab 的是連結(網址在 savedURL,標題用 item.title,沒有就用 savedTitle);list 是資料夾(名稱在 item.title);itemContainer 和 splitView 不要變成資料夾,把裡面的分頁直接攤平。
5. 輸出標準的 Netscape 書籤 HTML 到桌面的 arc_bookmarks.html。最外層包一個「Arc Import」資料夾,裡面每個 Space 一個資料夾,再加一個 Favorites 資料夾。標題和網址要做 HTML 跳脫。
6. 執行後告訴我連結和資料夾各有幾個,再一步步告訴我怎麼從 chrome://settings/importData 匯入,以及去 chrome://bookmarks 檢查。
不要把我的書籤標題或網址印出來,只要數量。
如果你比較想用現成工具,也可以改貼這句:「請先讀過 GitHub 上 ivnvxd/arc-export 的 main.py 原始碼,告訴我它會讀寫哪些檔案、有沒有連網,確認安全後再幫我執行。」
為什麼 Chrome 不能直接匯入 Arc
Arc 底層是 Chromium,但 Chrome 的「匯入書籤和設定」(chrome://settings/importData)來源清單裡沒有 Arc,不能直接匯入。
Arc 本身也沒有傳統書籤,沒有內建的書籤匯出。你在 Arc 裡當書籤用的東西,其實是側邊欄的 Pinned Tabs、Spaces 和 Favorites,全部存在同一個檔案:
~/Library/Application Support/Arc/StorableSidebar.json
所以要做的事只有一件:把這個 JSON 轉成標準的 Netscape 書籤 HTML。Chrome、Safari、Firefox 都吃這個格式。
StorableSidebar.json 的結構
寫腳本或檢查 AI 寫的腳本時,會用到這幾點:
- 資料在
sidebar.containers[1],裡面有items(所有節點)、spaces(各個 Space)、topAppsContainerIDs(Favorites)。 - 這三個陣列是「id 字串、物件」交錯排的,同一個節點會出現兩次,只要取物件那一筆。
- 每個 Space 有
title和containerIDs,格式像["pinned", <pinned 容器 id>, "unpinned", <id>]。只取 pinned 那一個,unpinned 是臨時分頁。 - 每個 item 有
id、title、childrenIds、data。data的種類:
| data 種類 | 是什麼 | 轉換時怎麼處理 |
|---|---|---|
tab |
連結 | 網址在 savedURL,標題用 item.title,沒有就用 savedTitle |
list |
資料夾 | 名稱在 item.title,變成書籤資料夾 |
itemContainer |
容器 | 不建資料夾,往下走 |
splitView |
分割畫面,包著好幾個分頁 | 直接攤平成一般連結 |
從每個 Space 的 pinned 容器開始,依 childrenIds 遞迴往下走,就能還原整棵樹。
不想用 AI:直接用這支腳本
這是我依上面的結構寫好、在自己的 Arc 資料上跑過的版本,結果跟今天搬家時一樣是 270 個連結、40 個資料夾。它只用 Python 標準函式庫,只讀 StorableSidebar.json,輸出到桌面。macOS 內建的 python3 就能跑(第一次執行如果跳出安裝開發者工具的視窗,照著裝完即可)。
存成 arc_to_bookmarks.py,在終端機執行 python3 arc_to_bookmarks.py:
import html, json, pathlib
SRC = pathlib.Path.home() / "Library/Application Support/Arc/StorableSidebar.json"
OUT = pathlib.Path.home() / "Desktop/arc_bookmarks.html"
box = json.loads(SRC.read_text())["sidebar"]["containers"][1]
# items, spaces and topAppsContainerIDs alternate: an id string, then its object
items = {i["id"]: i for i in box["items"] if isinstance(i, dict)}
spaces = [s for s in box["spaces"] if isinstance(s, dict)]
counts = {"links": 0, "folders": 0}
def node(item_id, depth):
item = items.get(item_id)
if not item:
return []
pad, data = " " * depth, item["data"]
if "tab" in data:
counts["links"] += 1
url = data["tab"].get("savedURL", "")
title = item.get("title") or data["tab"].get("savedTitle") or url
return [f'{pad}<DT><A HREF="{html.escape(url)}">{html.escape(title)}</A>']
kids = [line for c in item.get("childrenIds", []) for line in node(c, depth + 1)]
if "list" in data:
counts["folders"] += 1
return folder(item.get("title") or "Untitled", kids, depth)
return [line[2:] for line in kids] # itemContainer, splitView: flatten
def folder(name, lines, depth):
pad = " " * depth
return [f"{pad}<DT><H3>{html.escape(name)}</H3>", f"{pad}<DL><p>", *lines, f"{pad}</DL><p>"]
def children(container_id, depth):
return [line for c in items.get(container_id, {}).get("childrenIds", []) for line in node(c, depth)]
body = []
for space in spaces:
ids = space.get("containerIDs", [])
pinned = ids[ids.index("pinned") + 1] if "pinned" in ids else None
body += folder(space.get("title") or "Space", children(pinned, 3), 2)
favs = [line for cid in box.get("topAppsContainerIDs", []) if isinstance(cid, str) for line in children(cid, 3)]
body += folder("Favorites", favs, 2)
root = folder("Arc Import", body, 1)
OUT.write_text("\n".join(["<!DOCTYPE NETSCAPE-Bookmark-file-1>",
'<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">',
"<TITLE>Bookmarks</TITLE>", "<H1>Bookmarks</H1>", "<DL><p>", *root, "</DL><p>"]))
print(f"{counts['links']} links, {counts['folders']} folders -> {OUT}")
資料夾數量只算 Arc 裡的資料夾(list),每個 Space 和 Favorites 外層那一層不算在內。
匯入 Chrome 的步驟
- 先產生
arc_bookmarks.html(用提示詞或上面的腳本都可以)。外層包一個「Arc Import」資料夾,匯進來才不會和 Chrome 原有的書籤混在一起。 - 在 Chrome 網址列輸入
chrome://settings/importData。 - 來源選「書籤 HTML 檔案」,選桌面上的
arc_bookmarks.html。 - 到
chrome://bookmarks打開「Arc Import」資料夾,確認每個 Space 和資料夾都在。
用 AI 寫腳本的好處
網路上找到的轉換程式,你得先相信它沒有做多餘的事。讓 AI 讀你自己的檔案、當場寫一支腳本,程式碼就攤在眼前,你可以要求它只讀不寫、只用標準函式庫、不連網,也看得到它讀了哪個檔案。
StorableSidebar.json 也不是公開格式,結構哪天變了,現成工具要等作者更新;AI 會先檢查結構,再照你手上的檔案寫。
注意事項
- 沒有釘選的分頁不會被轉過去。 Today 區那些臨時分頁不在 pinned 容器裡,想保留的話,搬家前先在 Arc 裡把它們釘選起來。
- 這篇只談書籤。 密碼、擴充功能、瀏覽記錄要另外處理。
- 密碼可以從
arc://password-manager/settings匯出 CSV,再匯入 Chrome。CSV 是明文,匯入完馬上刪掉,也記得清空垃圾桶。 - 瀏覽記錄不建議直接複製 Arc 的 History 檔過去,會覆蓋 Chrome 原本的記錄,兩邊版本不同時格式也可能不相容。
常見問題
Arc 可以直接匯出書籤嗎?
不行。Arc 沒有內建書籤匯出,Pinned Tabs、Spaces 和 Favorites 存在 StorableSidebar.json,要自己轉成書籤 HTML。
為什麼 Chrome 的匯入清單裡沒有 Arc? Chrome 的「匯入書籤和設定」只列出它支援的瀏覽器,Arc 不在裡面。即使 Arc 底層是 Chromium,也要走「書籤 HTML 檔案」這條路。
轉過去之後資料夾層級還在嗎?
在。腳本依 childrenIds 還原整棵樹,Arc 裡的資料夾會變成 Chrome 的書籤資料夾,每個 Space 各自一個資料夾。只有分割畫面(splitView)會被攤平成一般連結。
這個 HTML 檔可以匯入 Safari 或 Firefox 嗎? 可以。Netscape 書籤 HTML 是各家瀏覽器通用的格式。
腳本會不會弄壞我的 Arc?
不會。它只讀 StorableSidebar.json,輸出寫在桌面,不改 Arc 的任何檔案。用 AI 的話,在提示詞裡要求它只讀不寫,並在執行前看一下腳本。