如果這個工具幫到了你,可以請作者喝杯咖啡 ☕
在瀏覽器裡直接測試XPath表示式,立刻看到匹配結果。適合爬蟲、資料採集、前端除錯。
tools.xpath-online-test-tool.inputs.namespaceHelp
tools.xpath-online-test-tool.results.emptyMessage
寫爬蟲想提取網頁裡所有商品價格的連結,或者除錯自動化測試指令碼裡的元素定位,又或者只是好奇某段HTML裡某個標籤到底有幾個——用XPath可以一句話定位。但XPath寫對了沒?表示式容易手滑。我們的XPath線上測試工具讓你貼一份HTML/XML文件,寫上XPath,立即顯示匹配數量和高亮內容,省去反覆重新整理頁面或開啟開發者工具的麻煩。
XPath是一種在XML文件裡找節點的路徑語言,類似檔案系統的目錄路徑。比如//div[@class='price']表示“所有class屬性等於price的div元素”。把它想象成給文件裡的元素一個“地址”,你用這個地址就能直接拿到它們。開發者經常用它來從網頁裡提取資料,或者控制自動化流程。
//a/@href表示提取所有超鏈接的地址。假設你有一段簡單的商品HTML(貼上到文件框):
<div id="products">
<div class="item">
<span class="name">無線滑鼠</span>
<span class="price">¥39.9</span>
</div>
<div class="item">
<span class="name">機械鍵盤</span>
<span class="price">¥129</span>
</div>
</div>你想提取所有商品名稱。在XPath框輸入://span[@class='name']/text()。點選測試,結果區域會顯示“匹配到2個節點”,並列出:
1. 無線滑鼠
2. 機械鍵盤
假如你想一次性拿到名稱和價格,可以用聯合選擇或返回元素的父節點,但初學者先用簡單表示式。
再看一個對照例:如果你寫//span[@class='price'](不加/text()),匹配結果會顯示“2個節點”,但每個節點是<span class="price">¥39.9</span>這樣的整個標籤——因為XPath預設返回節點,不是文字。如果你的目的是拿數字,記得加/text()或string()。
//tag 往往不匹配,需要先註冊名稱空間字首。我們的工具目前只支援無名稱空間或顯式字首的匹配,遇到名稱空間時請先手動移除或改用local-name() 函式。<Div> 和 <div> 是兩個不同的節點,寫表示式時要注意。// 導致效能問題:雖然工具處理小文件很快,但在真實大文件裡濫用 // 會掃描全部節點,建議用具體路徑如 /html/body/div[1]/ 來提高效率。//div [@class=...](方括號前有空格)是語法錯誤,工具會提示“Invalid expression”。寫表示式時不要亂加空格。text() 能取到所有文字:text() 只返回直接文字子節點,巢狀元素裡的文字不會自動合併。要取全部文字可以用 string() 或 normalize-space()。local-name() 或先去除名稱空間宣告。@class='value' 但實際屬性值前後有空格。可以先用 //* 看看所有元素,再逐步縮窄。contains() 函式嗎?//div[contains(@class, 'price')] 可以匹配 class 屬性包含“price”的 div。//a 返回所有 a 元素,然後結果框會顯示節點的文字(inner text)。要拿 href 屬性,用 //a/@href,但注意返回的是屬性節點,文字為空。可以同時寫兩個表示式分兩次測試,或者用多表達式功能(如果工具有提供)。[object Text] 之類的,不是我要的文字/text() 或 /string() 可以拿到字串。現在你可以在上方的輸入框裡試試自己的 HTML 和 XPath 表示式了。