XPath 选择器
理解 XPath 的定位原理与优势
掌握 XPath 常用语法与轴定位
能处理复杂场景的精准元素定位
核心讲解
XPath 是 XML 路径语言,在 HTML 中通过元素的路径关系来定位,功能最强大,任何复杂元素都能定位,是自动化必备技能。
(1)基础语法//:相对路径,从任意位置开始,推荐用/:绝对路径,从根开始,不推荐标签名:匹配指定标签,*匹配任意标签@属性名:引用属性text():元素的文本内容
用[]加条件,支持多条件组合:
属性匹配:
//input[@id='kw']文本匹配:
//a[text()='新闻']包含文本:
//a[contains(text(),'百')]多条件:
//input[@id='kw' and @name='wd']
父元素:
/..或parent::*祖先元素:
ancestor::标签后面兄弟:
following-sibling::标签前面兄弟:
preceding-sibling::标签子元素:
child::标签
//ul/li[2]:ul 下第 2 个 li,从 1 开始
代码示例
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
# 1. 基础属性定位
input_box = driver.find_element(By.XPATH, "//input[@id='kw']")
# 2. 文本精确匹配
news_link = driver.find_element(By.XPATH, "//a[text()='新闻']")
# 3. 文本包含
link = driver.find_element(By.XPATH, "//a[contains(text(), '更多')]")
# 4. 多条件组合
btn = driver.find_element(By.XPATH, "//input[@id='su' and @value='百度一下']")
# 5. 层级定位:通过父找子
form_input = driver.find_element(By.XPATH, "//form[@id='form']//input[@name='wd']")
# 6. 轴定位:找后面的兄弟
news_next = driver.find_element(By.XPATH, "//a[text()='新闻']/following-sibling::a[1]")
print("新闻下一个:", news_next.text)
# 7. 找父元素
input_parent = driver.find_element(By.XPATH, "//input[@id='kw']/..")
print("父标签:", input_parent.tag_name)
# 8. 位置索引
second_nav = driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[2]")
print("第二个导航:", second_nav.text)
# 9. 任意属性开头匹配
ele = driver.find_element(By.XPATH, "//a[starts-with(@href, 'http://news')]")
driver.quit()
常见误区
用绝对路径定位:
/html/body/div...,页面稍微一变就失效,绝对不要用索引从 0 开始:XPath 的索引是从 1 开始,不是 0
contains 参数写反:
contains(属性, 值),不是contains(值, 属性)文本定位空格问题:元素文本前后有空格时,精确匹配会失败,用 contains 更好
XPath 写太长:层级太多稳定性差,尽量用属性和文本缩短路径
课后练习
用 XPath 定位包含 “百度” 文字的所有链接
通过子元素的文字,找到它的父级 div 元素
定位表格中包含 “张三” 的那一行的所有单元格

