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,使用部分匹配而非精確匹配 |
處理浮動元素 | 使用相對位置定位 | 透過周圍的穩定元素來定位浮動元素 |