JSON-LD 檢查工具擷取失敗最常見的原因,包括來源 HTML 與爬蟲實際接收到的內容不一致、某個格式錯誤的 JSON 區塊抹除了閱讀器對周圍有效項目的看法,或是某個設定檔將「缺少」的屬性指派給實際上並無任何已記載規則集要求的屬性。

JSON-LD 檢查工具的擷取功能以一項特定契約為基礎:檢查你貼入其中的標記,並回報實際存在的內容。大多數問題都出在這項契約與人們帶入的假設之間的交界處。最常見的失敗模式包括:你貼上的來源並非爬蟲看到的來源;某個格式錯誤的指令碼區塊無聲地抹除了你看見同一份文件內有效項目的機會;「必要屬性」警告實際上屬於某個設定檔,而該設定檔並無針對你所用類型的已記載規則;或者擷取結果很乾淨,你卻仍假定這代表豐富結果即將出現。這些全都是類別判斷錯誤,而非解析器缺陷。像 Structured Data Checker & Extractor 這類工具,其擷取步驟刻意採取狹義範圍:找出貼入文件中存在的每個 JSON-LD 指令碼區塊與每個 Microdata 項目,展開 @graph 和陣列容器,並保留已宣告的 @type 值及可見屬性。凡是超出這項狹義工作範圍的事項——擷取線上頁面、評分是否符合資格、模擬搜尋引擎——完全不會納入擷取結果,而將它們視為結果的一部分,正是人們因 JSON-LD 檢查工具輸出而誤導自己的最大原因。

what can go wrong when i extract structured data checker when using json ld checker
JSON-LD 檢查工具擷取過程中可能發生的問題

擷取功能實際出錯的位置

大多數失敗都集中在這項契約與閱讀者假設之間的交界處,並可分為四個可辨識的類別。第一個是輸入本身:檢查工具會查看你交給它的內容,而這些輸入由你組合。第二個是解析器隔離:格式錯誤的 JSON 區塊可能讓較不謹慎的工具無法看見同一份文件中的有效項目。第三個是設定檔落差:某些警告對於工具沒有已記載規則的類型而言,看起來卻很權威。第四個是推論跳躍:將乾淨的擷取結果視為符合資格的同義詞。這些全都是解讀結果時的類別判斷錯誤,而不是產生結果的解析器有缺陷。

為何貼上的 HTML 不同於線上頁面

現代框架會在初始 HTML 回應之後注入結構化資料、在瀏覽器中編輯 DOM,或一開始就依賴 JavaScript 來轉譯 JSON-LD 區塊。如果你複製的是原始伺服器回應,指令碼標籤可能尚未存在。如果你透過開發者工具複製完整轉譯後的 DOM,你可能會擷取以文字為基礎的爬蟲從未執行的標記,或納入根本不存在於所提供文件中的僅限用戶端水合內容。兩種輸出可能不一致,而擷取功能只能看見你所貼上的其中一種。

因此,嚴謹的擷取工作流程會先比較原始回應、轉譯後的 DOM,以及爬蟲實際可見的輸出,再得出任何結論。當這三種輸入不一致時,擷取功能無法解決問題;只有部署作業,以及針對已部署 URL 執行的官方驗證工具才能做到。貼上其中一種內容,再將擷取結果視為最終結論,是最容易讓自己誤信標記正確、但線上頁面其實完全不同的可靠方式。

設定檔警告代表與不代表的意思

Schema.org 定義了廣泛的詞彙,但搜尋引擎針對特定功能的必要屬性清單,涵蓋範圍要狹窄得多。建構良好的檢查工具只會在它對該類型具有已記載規則集的地方發出警告;對於其他任何類型,它會擷取物件,並將驗證問題留待確認。這種區分是刻意設計的。為工具真正不認識的類型捏造要求,只會產生看似權威卻毫無意義的警告,而這比保持沉默是更危險的失敗模式。

在此情境中,警告只有一項意思:本地設定檔預期此 @type 應有的某個屬性,未在貼入的物件中找到。它不表示搜尋引擎會拒絕該頁面,而沒有警告也不表示該頁面符合資格。下表將每一層實際能回答的問題,與人們通常拿來問它的問題區分開來。

報告層級它實際告訴你的內容它無法告訴你的內容
擷取貼入來源中存在的每個 JSON-LD 物件、@graph 節點與 Microdata 項目。線上爬蟲是否看見相同的來源。
設定檔警告本地規則集預期此類型應有的某個屬性,未在貼入來源中找到。搜尋引擎會拒絕、忽略或顯示該頁面與否。
未顯示警告本地設定檔在貼入來源中找到了每個預期屬性。任何特定豐富結果、知識面板或增強功能是否會出現。
格式錯誤的 JSON 區塊某個特定指令碼依 JSON 語法規則解析失敗。失敗原因,以及周圍頁面是否在其他方面保持完整。

具體而言,對於 Microdata,值來自實際 HTML 元素上的屬性:itemscope、itemtype 和 itemprop 用來定義範圍、已宣告類型與屬性名稱,而值則從內容屬性、連結、媒體來源屬性、日期值及文字內容中讀取。WHATWG Microdata 規格 說明了這些屬性預期如何被使用,而任何與該模型不一致的擷取,都代表擷取了錯誤的內容。巢狀 Microdata 項目會保持可見的巢狀結構;將不相關的屬性攤平成字串,代表擷取步驟內部發生了問題,而非來源本身有問題。

如何執行擷取而不誤導自己

擷取契約的狹義範圍是一項特色,而非限制。若刻意加以運用,像 Structured Data Checker & Extractor 這類工具就能成為預先檢查機制,防止你假定尚未經過測試的事情。下列步驟正是以此方式使用它。

  1. 貼入所交付的 HTML 來源,或經過控制的轉譯後 DOM 匯出內容。檢查工具絕不會擷取或執行頁面,貼入文件內的任何指令碼也不會執行;因此,你貼入的內容與爬蟲所見內容之間的界線,仍須由你管理。
  2. 執行擷取,並分別檢閱三種輸出:JSON-LD 解析錯誤、Microdata 項目,以及聚焦於缺少屬性的警告。格式錯誤的 JSON 區塊會單獨回報,因此某個損壞的指令碼不會抹除在同一份文件中其他地方找到的有效項目。
  3. 對於每個擷取項目,確認已宣告的 @type 與可見屬性,是否符合你真正希望頁面描述的內容。巢狀項目應保持可見的巢狀結構,而非攤平成不相關的字串。
  4. 對照連結的文件閱讀每則設定檔警告。警告表示本地設定檔找不到該屬性;它無法證明任何消費者都會拒絕該頁面,而沒有警告也無法證明符合資格。
  5. 修正來源範本、重新部署,然後使用針對你實際瞄準之搜尋功能的官方工具,驗證已部署的 URL。本地擷取是關於貼入文件的證據,而非關於搜尋顯示的承諾,因此官方驗證工具是唯一能在線上頁面上完成整個檢驗循環的測試。

如果擷取功能顯示某個問題,而官方驗證工具未能重現該問題,這種不一致通常可追溯至上述三種 HTML 輸入彼此分歧。如我們在 結構化資料的 JSON-LD 檢查工具步驟 指南中所述,在進一步編輯之前記錄這項差異,可讓除錯工作以事實為依據,而非憑空猜測。

擷取完成後,真正的決策才要開始

乾淨的擷取結果是所能取得的最小成果:它表示貼入的標記可以解析,每個指令碼區塊與 Microdata 項目都已納入考量,而本地設定檔——如果確實存在——也未發現落差。這些都不是排名訊號、收錄承諾,或是該標記描述了使用者能在頁面上看見之內容的證據。如果標記在技術上有效,卻不準確、隱藏、無關或捏造,乾淨的擷取結果仍會顯示為「乾淨」,因為有效性與實用性是不同的問題。

因此,擷取之後,下一步絕不是「直接推出」。你應確認標記是否以具體且準確的值反映可見的頁面內容;完整且真實的屬性數量較少,優於塞滿通用填充內容的大型物件。之後,與你瞄準之搜尋功能相關聯的驗證工具——Google 功能的官方驗證工具,加上重新抓取後的 Search Console 增強功能報告——才會決定是否真的有內容顯示。如果你的範本使用 RDFa,它便位於此工具目前的擷取邊界之外,該工具絕不會將其計為缺少或無效的結構化資料;如果你依賴 RDFa,本地擷取將無法保護這項工作,而你需要使用其他檢查工具來處理該路徑。最後,請記得輸入大小與項目數量都受到設計限制,因此意外產生的全站傾印不會讓頁面當機,而檢查工具也不會跟隨連結、載入圖片、提交表單或評估內嵌 JavaScript——所有這些限制,都是使擷取一開始便具決定性的同一份契約的一部分。

如需更深入的探討,請參閱 JSON-LD 檢查工具擷取:值得注意的細節。