從大型 sitemap 文字貼上中萃取 URL,可在瀏覽器本機解析 loc 元素,產出去重複後的「一行一個 URL」清單,並將 50,000 個唯一 URL 上限與五百萬個 UTF-16 程式碼單位的輸入上限強制視為硬性失敗,而非靜默截斷。此處所稱的 sitemap 文字,指的是實際的 XML 文件本身——不論是放在剪貼簿或編輯器中——而不是可爬取的端點、壓縮檔,或遠端 URL 字串,而這正是讓這項任務能由貼上解析器處理,而非由爬蟲或線上服務處理的原因。讀者通常想要的輸出,是依來源出現順序排列的絕對 URL 去重複清單,其中來自主機大小寫、預設埠號或結尾斜線的重複項目會合併成單一行,而格式錯誤的 loc 值會自整個回合中完全移除,不會以盡力猜測的字串形式勉強通過。除此之外——例如檢查即時 HTTP 狀態、比較標準網址、決定哪些內容會被建立索引——皆屬於針對線上站點另外進行的檢查,而解析器的工作,正是在這條界線開始之處精確結束。
當文件很小時,這項工作相當單純,但大型 sitemap 會改變整個局面。內容豐富的網站,其 urlset 在納入 lastmod、priority 等選用子元素後,輕易就能超過十萬行 XML,而 sitemapindex 則可能引用數十個子 sitemap。多數現成做法在這個規模下都會失靈——試算表會截斷、尋找取代的迴圈會重複計算或漏算,遠端服務則會拒絕上傳。「貼上、本機解析、再複製出來」這種做法因為整份文件會先載入記憶體,接著解析器才做出任何承諾,因而能更妥善地因應規模。

「大型文字」對 sitemap 貼上而言實際代表什麼
當有人搜尋如何從 sitemap 大型文字中萃取 URL 時,他們通常握有下列三種產出物之一:從 CMS 匯出的 urlset、從開發者終端機貼上的 sitemapindex,或是從 .gz 檔解壓縮後的複本——這些內容往往無法整齊地塞進試算表的一欄。這幾種情況下的 XML 體積都可能達到數 MB,而實務上的 urlset 文件,一旦納入 lastmod、changefreq、priority 等選用子元素,經常會超過十萬行。
此處所謂「大型」,是依據解析器強制執行的兩項上限來衡量:去重複後 50,000 個唯一 URL,以及五百萬個 UTF-16 程式碼單位的輸入文字。以一個 urlset 一行一個條目來計算,五百萬個程式碼單位大約等同於 4 到 5 MB 的 UTF-8——比多數 CMS 匯出檔來得充裕,但仍遠低於生產環境 sitemap 解壓縮後可能膨脹到的規模。任何更大的檔案,都必須先切割成由 sitemap index 引用的子檔,才能交由貼上解析器處理。
為何純瀏覽器的貼上解析器適合處理大型 XML 區塊
Sitemap URL Extractor 的設計圍繞著單一原則:XML 以文字形式貼上、在當前瀏覽器中解析,絕不上傳。這個原則形塑了整體使用體驗。完整的貼上內容會保存在頁面中,而非串流至伺服器,這代表解析器在產出結果之前,能先取得完整的結構。對於接近上限的大型貼上而言,這種做法正好符合需求——解析器只需走訪文件一次,即可判斷結構是否有效,並決定回傳完整清單,或是回傳指向出錯的 loc 或 item 的編號錯誤。
瀏覽器端解析同樣能讓 staging 與上線前的清單保持隱私。一份含有數十萬個 URL 的生產 sitemap 本身就是敏感的產出物,只為了取回一份清單就把它推送到遠端,會製造不必要的稽核軌跡。由於此元件不會發出任何網路請求,貼上內容與產生的清單都會保留在裝置上,除非使用者另行複製。
輸出的清單並非只是「每一行看起來像 URL 的東西」。每個條目都是 WHATWG URL 標準 所稱的序列化絕對 URL,主機部分已轉為小寫、預設埠號已移除,非 ASCII 的路徑字元則經過百分比編碼。正是這個標準化步驟,讓去重複功能得以回報準確的重複數量,而不會把 example.com 與 Example.com:80 視為兩筆不同的條目。
如何從大型 sitemap 文字中萃取 URL
- 在瀏覽器中開啟 Sitemap URL Extractor,並清空編輯器。
- 將一份 urlset 或 sitemapindex 文件的完整 XML 文字貼入編輯器。若原始檔案為 .gz,請先解壓縮,讓編輯器收到的是未壓縮的 XML 文字;壓縮的位元組不會被解析。
- 執行萃取。元件會檢查根元素、走訪每個 url 或 sitemap 項目、解碼其 loc 子元素中的標準 XML 實體,並拒絕巢狀標記、DTD 宣告,或自訂實體參考。
- 檢視結果區塊。它會回報偵測到的根類型(urlset 或 sitemapindex)、接受的唯一 URL 數量、被移除的標準化重複數量,以及依首次出現順序排列的完整去重複清單。
- 將「一行一個 URL」的清單複製到剪貼簿。可直接作為爬蟲檢查清單使用、貼入試算表,或匯入其他工具。
- 依需要另外執行即時檢查。萃取僅能確認貼上結構中出現了有效的 loc;HTTP 狀態、標準網址標籤、robots 指令及建立索引等,仍須對線上站點另行驗證。
解析器在貼上的 XML 中會驗證哪些項目
在第一個 URL 進入輸出清單之前,解析器會強制執行一組特定的契約。前端的位元組順序標記、XML 宣告與註解會在開頭被移除。文件必須宣告唯一的根元素——urlset 或 sitemapindex——並具備一致的選用命名空間前置(如 sm:urlset、sm:url、sm:loc),或採用常見的預設命名空間形式。內部的每個 url 或 sitemap 項目都必須包含其直接的 loc 子元素,而該 loc 必須包含純文字,不得含有巢狀 XML。
loc 內部僅解碼五個預先定義的 XML 實體,以及有效的十進位或十六進位 Unicode 純量參考。未知的實體、格式錯誤的數值參考、DTD 宣告與自訂實體宣告,都會使整個回合失敗。這種硬性失敗的行為是刻意為之:元件不會靜默猜測實體應解析為何值,因為隱藏的實體展開行為,正是讓一個小工具變成安全意外的那種東西。
XML 解碼完成後,每個 loc 值會送交瀏覽器的 WHATWG URL 實作處理。解析器僅接受絕對的 http 與 https URL,且每個序列化後長度須少於 2,048 字元,以符合該通訊協定本身的 loc 限制。含有認證資訊、片段、未編碼空白字元、格式錯誤的百分比編碼、反斜線、相對路徑,或非 http 配置的 URL 一律會被拒絕;而諸如 image:loc 等延伸位置,不會在缺少頁面 loc 時被取代,因為它們描述的是不同的資源角色。
大型貼上的限制與失敗模式
元件在每次執行時會強制執行兩項相互影響的限制。第一項是去重複後 50,000 個唯一 URL。第二項是五百萬個 UTF-16 程式碼單位的輸入文字。超出任何一項上限,都會使整個操作失敗,而不會進行截斷。沒有「僅取前 50,000 筆」的模式,也不存在「先警告再截斷」的行為,因為以不完整的清單冒充完整結果,將使工具失去稽核意義。
當貼上失敗時,錯誤訊息會刻意明確指向破壞驗證規則的編號 loc 或項目,讓來源能就地修正,而不是被默默跳過。大型貼上常見的失敗模式包括:從 CMS 匯出檔中混入的殘留 DTD 宣告、sitemapindex 將 sitemap 條目與 image 條目混雜在一起,以及 url 條目的 loc 中含有巢狀標記(例如 CDATA 包裝,或從未解碼的 HTML 跳脫序列)。這些情況都應在來源 XML 中修正,而非由工具端設法規避。
若生產環境的 sitemap 已逼近這些上限,正確的做法是驗證實際未壓縮的位元組大小,並考慮將檔案切割成由 sitemap index 引用的較小子檔。大量處理限制指南說明了這兩項上限如何與一般 XML 密度互動。根據 Google 的sitemap 說明文件,sitemap 本身只是供爬蟲探索的提示,而非建立索引的保證;實務上,一份體積較小、格式正確的子檔,通常表現得比一份瀕臨上限的大型母檔更為理想。
貼上 sitemapindex 與貼上 urlset 的差異
| 情境 | 元件回傳的內容 | 元件不會執行的動作 |
|---|---|---|
| 貼上從 CMS 匯出的 urlset | 每行一個去重複的 URL,根元素回報為 urlset | 擷取線上檔案或檢查狀態碼 |
| 貼上從終端機取得的 sitemapindex | 每行一個去重複的 sitemap 檔案位置,根元素回報為 sitemapindex | 將每個子檔展開為其頁面 URL |
| 貼上含有 DTD 宣告的文字 | 執行失敗,並回報指向該 DTD 的明確錯誤 | 靜默移除 DTD 並繼續 |
| 貼上解壓縮後的 .gz 檔文字 | 正常解析 | 解壓縮仍是壓縮狀態的 .gz 位元組 |
| 貼上遠端 URL 字串而非 XML 文字 | 第一個 loc 即發生 URL 解析失敗,執行失敗 | 於幕後下載該 URL |
此表明確劃出了界線。sitemapindex 是 sitemap 檔案的目錄,而不是遞迴的包裹檔,因此萃取作業只回傳直接的 sitemap 檔案位置,便在此停止。依序貼上這些檔案屬於各自獨立的操作,並非第一次操作內含的隱含步驟。同樣地,在編輯器中貼上遠端 URL 字串並不會觸發下載;編輯器預期接收 XML 文字,並將其他任何內容視為格式錯誤的 loc。
Treating the extracted list as audit evidence, not as indexing proof
An extracted list is one piece of evidence in a larger audit. Compare it with canonical URLs from the content database, with crawler landing pages from server logs, and with the analytics set of pages that actually receive traffic. The deduplication report is useful here: unexpected duplicates that show up in the source often reveal default-port or host-case variants that the source XML accidentally produced through template duplication.
For migration reviews, paste the pre-migration sitemap into the extractor, then paste the post-migration sitemap, and diff the two lists. Because the output preserves first-seen order, both lists stay directly comparable. For redirect audits, the same list feeds a separate batch status checker. For a noindex review, the list feeds a separate meta robots inspector. The tool does not attempt any of those checks itself, and that is by design — keeping the responsibility narrow is what lets it stay correct on the one thing it does.
Finally, keep the limits in mind when interpreting the result. A clean 48,000-line extraction does not mean the site has 48,000 indexable pages, only that 48,000 distinct loc values passed the parser's structural and URL-shape checks against the pasted text. Crawlability, canonical selection, robots directives, and indexing all live with the live site, and they are checked against the live site, not against the paste.
If you're weighing options, Keyword Density Checker on Windows: Paste, Count, Read covers this in detail.