🧭 XPath 語法簡介(Web 自動化核心定位手段)
一、XPath 是什么?
- XPath(XML Path Language)是用于在 XML/HTML 文檔中定位節點的語言,由 W3C 標準定義。
- 瀏覽器支持的是 XPath 1.0。
- 應用場景廣泛:用于 Selenium、Scrapy 爬蟲、Appium 移動自動化 等。
二、XPath 與 CSS 對比
特性 | CSS Selector | XPath |
向上選父節點 | ? 不支持 | ? 支持 |
向前選兄弟節點 | ? 不支持 | ? |
根據屬性部分匹配 | ? | ? |
結構匹配表達力強 | 中等 | 非常強大 |
三、XPath 基本語法
1?? 絕對路徑(從根節點開始)
/html/body/div
等同于 CSS:html > body > div
2?? 相對路徑(常用)
//div
表示從任意位置開始,選擇所有的 div
元素。//
類似 CSS 的后代選擇器空格。
3?? 子元素選擇
//div/p # 直接子元素
//div//p # 任意后代元素
4?? 通配符 *
//div/* # div下所有直接子節點
四、按屬性選擇元素
基礎語法
//*[@屬性名='屬性值'] # 注意 @ 符號和引號
示例
//*[@id='west']
//*[@class='capital huge-city']
?? class 為多個值時,必須匹配完整。
存在屬性(不要求值)
//*[@multiple] # 選擇有 multiple 屬性的所有元素
屬性部分匹配
//*[contains(@style, 'color')] # 包含 color
//*[starts-with(@style, 'color')] # 以 color 開頭
?? ends-with()
是 XPath 2.0,不被瀏覽器支持。
五、按位置/順序選擇
第 N 個某類元素
//p[2] # 所有 p 中的第 2 個
//div/p[2] # div 下的 p 中第 2 個
第 N 個任意子元素
//div/*[2]
倒數第幾個
//p[last()] # 最后一個 p
//p[last()-1] # 倒數第二個
//div/p[last()-2] # div 中 p 的倒數第三個
范圍選擇
//option[position()<=2]
//*[@class='multi_choice']/*[position()>=last()-2]
六、組合選擇、父節點與兄弟節點
組選擇(或運算)
//option | //h4
//*[@class='a'] | //*[@class='b']
父節點選擇
//*[@id='china']/..
可以用于先選子,再回到父節點。
兄弟節點選擇
//*[@class='single_choice']/following-sibling::* # 后續兄弟
//*[@class='single_choice']/preceding-sibling::*[1] # 前一兄弟
CSS 僅支持后續兄弟(~
),不支持前兄弟選擇。
七、Selenium 中使用 XPath 的注意點
1?? 基本用法
driver.find_elements(By.XPATH, "//div")
2?? 在 WebElement 內部查找子節點時要加 .
china = driver.find_element(By.ID, 'china')
elements = china.find_elements(By.XPATH, './/p') # 必須加點
如果不加 .//
,會從整個 DOM 根節點開始查找,而不是從當前元素。
? 小結:XPath 常用關鍵字/函數速查表
表達式 | 含義 | |
| 絕對路徑或直接子節點 | |
| 相對路徑或任意后代節點 | |
| 通配符,匹配任意標簽 | |
| 根據屬性精確匹配 | |
| 屬性包含子串 | |
| 屬性以字符串開頭 | |
| 子元素的位次 | |
| 最后一個子元素位置 | |
| 父節點 | |
| 前兄弟節點 | |
| 后兄弟節點 | |
` | ` | 組選擇 |