XPath 爬蟲語法大全:完整對照表與實戰技巧
XPath 爬蟲實戰語法對照表
基本選擇器
用途 |
XPath 語法 |
說明 |
範例 |
選擇所有元素 |
//tag |
選擇頁面上所有指定標籤的元素 |
//div 選擇所有 div 元素 |
根據 ID 選擇 |
//*[@id='ID值'] |
選擇具有特定 ID 的元素 |
//*[@id='header'] 選擇 ID 為 header 的元素 |
根據 Class 選擇 |
//*[contains(@class, 'CLASS值')] |
選擇具有特定 Class 的元素 |
//*[contains(@class, 'btn')] 選擇 class 包含 btn 的元素 |
選擇精確 Class |
//*[@class='CLASS值'] |
選擇 class 屬性完全匹配的元素 |
//*[@class='btn-primary'] 選擇 class 等於 btn-primary 的元素 |
選擇屬性 |
//*[@屬性='值'] |
選擇具有特定屬性值的元素 |
//*[@href='https://example.com'] 選擇連結到 example.com 的元素 |
層級關係選擇器
用途 |
XPath 語法 |
說明 |
範例 |
子元素 |
//父元素/子元素 |
選擇直接子元素 |
//div/p 選擇所有 div 的直接子 p 元素 |
所有後代 |
//父元素//後代元素 |
選擇所有後代元素,不限層級 |
//div//span 選擇所有 div 內的 span 元素,不論層級 |
父元素 |
//元素/.. |
選擇元素的父元素 |
//h1/.. 選擇所有 h1 元素的父元素 |
祖先元素 |
//元素/ancestor::標籤 |
選擇元素的祖先元素 |
//li/ancestor::div 選擇 li 元素的 div 祖先 |
上一個兄弟元素 |
//元素/preceding-sibling::標籤[1] |
選擇緊鄰的前一個兄弟元素 |
//li[3]/preceding-sibling::li[1] 選擇第三個 li 前的一個 li |
下一個兄弟元素 |
//元素/following-sibling::標籤[1] |
選擇緊鄰的後一個兄弟元素 |
//div/following-sibling::p[1] 選擇 div 後的第一個 p 元素 |
所有兄弟元素 |
//元素/following-sibling::標籤 |
選擇所有後續兄弟元素 |
//h2/following-sibling::p 選擇 h2 後的所有 p 元素 |
文本與內容篩選
用途 |
XPath 語法 |
說明 |
範例 |
包含特定文本 |
//*[contains(text(), '文本')] |
選擇包含指定文本的元素 |
//*[contains(text(), '登入')] 選擇包含「登入」文本的元素 |
精確文本匹配 |
//*[text()='文本'] |
選擇文本完全匹配的元素 |
//*[text()='確認'] 選擇文本為「確認」的元素 |
屬性包含文本 |
//*[contains(@屬性, '文本')] |
選擇屬性值包含特定文本的元素 |
//*[contains(@href, 'product')] 選擇 href 包含 product 的元素 |
元素內容為空 |
//*[not(node())] |
選擇沒有子節點的空元素 |
//div[not(node())] 選擇所有空的 div 元素 |
位置與索引篩選
用途 |
XPath 語法 |
說明 |
範例 |
第一個元素 |
(//元素)[1] |
選擇符合條件的第一個元素 |
(//tr)[1] 選擇頁面上第一個 tr 元素 |
最後一個元素 |
(//元素)[last()] |
選擇符合條件的最後一個元素 |
(//li)[last()] 選擇最後一個 li 元素 |
指定位置 |
(//元素)[位置] |
選擇特定位置的元素 |
(//td)[5] 選擇第五個 td 元素 |
位置範圍 |
(//元素)[position() > N and position() < M] |
選擇位置在指定範圍內的元素 |
(//tr)[position() > 1 and position() < 5] 選擇第 2 到第 4 個 tr |
奇數位置元素 |
//元素[position() mod 2 = 1] |
選擇位置為奇數的元素 |
//tr[position() mod 2 = 1] 選擇奇數行 |
偶數位置元素 |
//元素[position() mod 2 = 0] |
選擇位置為偶數的元素 |
//tr[position() mod 2 = 0] 選擇偶數行 |
複合條件選擇
用途 |
XPath 語法 |
說明 |
範例 |
AND 條件 |
//元素[@屬性1='值1' and @屬性2='值2'] |
同時符合多個條件 |
//input[@type='text' and @required] 選擇必填的文本輸入框 |
OR 條件 |
//元素[@屬性1='值1' or @屬性2='值2'] |
符合任一條件 |
//button[contains(@class, 'submit') or contains(@class, 'save')] 選擇提交或保存按鈕 |
NOT 條件 |
//元素[not(@屬性='值')] |
不符合特定條件 |
//div[not(contains(@class, 'hidden'))] 選擇不包含 hidden 類的 div |
多重條件 |
//元素[條件1][條件2] |
依序篩選多個條件 |
//div[contains(@class, 'product')][.//span[contains(@class, 'price')]] 選擇包含價格的產品 div |
常用爬蟲實例
用途 |
XPath 語法 |
說明 |
爬取表格數據 |
//table[@id='data']//tr |
選擇特定表格的所有行 |
爬取產品列表 |
//div[contains(@class, 'product-item')] |
選擇所有產品項目 |
爬取分頁連結 |
//div[contains(@class, 'pagination')]//a |
選擇分頁區域的所有連結 |
爬取導航菜單 |
//nav//li/a |
選擇導航菜單中的所有連結 |
爬取特定區塊 |
//div[@id='content']//p |
選擇內容區域中的所有段落 |
爬取圖片連結 |
//div[contains(@class, 'gallery')]//img/@src |
選擇圖庫中所有圖片的 src 屬性 |
爬取下拉選單選項 |
//select[@id='options']/option |
選擇特定下拉選單的所有選項 |
特殊功能選擇器
用途 |
XPath 語法 |
說明 |
範例 |
獲取屬性值 |
//元素/@屬性 |
直接獲取元素的特定屬性值 |
//img/@src 獲取所有圖片的 src 屬性值 |
元素計數 |
count(//元素) |
計算符合條件的元素數量 |
count(//a[contains(@href, 'product')]) 計算產品連結數量 |
連接多個結果 |
//元素1 | //元素2 |
合併多個 XPath 查詢結果 |
//h1 | //h2 選擇所有 h1 和 h2 元素 |
選擇可見元素 |
//*[not(contains(@style, 'display:none'))] |
選擇頁面上可見的元素 |
//div[not(contains(@style, 'display:none'))] 選擇可見的 div |
獲取節點文本 |
normalize-space(//元素) |
獲取元素的文本並去除多餘空白 |
normalize-space(//h1) 獲取 h1 標題的文本 |
動態頁面爬取技巧
用途 |
技巧 |
說明 |
等待元素加載 |
使用 WebDriverWait |
設置顯式等待,直到特定 XPath 選擇器能夠找到元素 |
處理 iframe |
先切換到 iframe 再定位 |
driver.switch_to.frame(driver.find_element_by_xpath("//iframe[@id='content']")) |
處理 AJAX 加載 |
使用顯式等待 |
等待特定元素可見或可點擊,再進行後續操作 |
處理動態 ID |
使用 contains 或 starts-with |
對於動態生成的 ID,使用部分匹配而非精確匹配 |
處理浮動元素 |
使用相對位置定位 |
透過周圍的穩定元素來定位浮動元素 |