Xpath表达式

xpath语法规则

  • / :根节点,节点分割符
    • 示例: 定位所有的 <a> 标签元素。
    • XPath: //a
    • 示例: 定位包含 <span> 子元素的 <div> 元素。
    • XPath: //div[span]
    • 示例: 定位第一个 <ul> 元素。
    • XPath: //ul[1]
  • // :任意位置
  • *:任意元素
  • @ :属性
    • 示例: 定位 class 属性值为 “my-class” 的 <div> 元素。
    • XPath: //div[@class='my-class']
  • . :当前属性
  • ..:父级节点

格式写法

  • 属性://*[@属性='属性值']
  • 文本值://*[text()='文本值']
    • 示例: 定位所有包含文本内容 “Hello” 的 <p> 元素 或 定位所有包含文本内容 “Hello” 的 <p> 元素。
    • XPath: //*[text()='Hello'] //p[text()='Hello']

高级查询 - 函数

  • contains模糊查询:[contains(@属性/text(),值)]

    • 示例: 定位 class 属性值中包含 “btn” 字符串的 <button> 元素。
    • XPath: //button[contains(@class, 'btn')]
    1
    2
    # 查找所有文本中含有 "Hello"的 div标签
    element = dr.find_element('//div[contains(text(), "Hello")]')
  • starts-with:用于匹配属性值的开头字符

    1
    2
    3
    4
    5
    6
    '''
    <div class="box1">Element 1</div>
    <div class="box2">Element 2</div>
    <div class="box3">Element 3</div>
    '''
    element = dr.find_element('//div[starts-with(@class, "box")]')
  • 使用多个条件组合定位元素(使用逻辑运算符如 and, or, not 来组合多个条件来定位元素)

    • 示例: 定位 id 为 “header” 且 class 包含 “menu” 的 <div> 元素。
    • XPath: //div[@id='header' and contains(@class, 'menu')]
  • concat():

    • 用于将多个字符串拼接成一个字符串。
    • 示例://span[contains(text(), concat('Name: ', 'John Doe'))] 选择包含 Name: John Doe<span> 元素。
  • substring():

    • 用于提取字符串的子字符串。
    • 示例://div[contains(substring(@class, 1, 3), 'abc')] 选择 class 属性的前三个字符为 abc 的所有 <div> 元素。
  • last():

    • 用于获取节点在当前节点列表中的最后一个位置。
    • 示例:(//li)[last()] 选择最后一个 <li> 元素。
  • matches() - 正则表达式

    • 用于检查文本是否与给定的正则表达式模式匹配。
    • 示例://div[matches(text(), '^Hello.*$')] 匹配文本以 Hello 开头的所有 <div> 元素。

层级关系

  • 子元素关系:
    • 示例: 定位 <div> 元素下的所有直接子元素。
    • XPath: //div/*
    • 使用子代选择符 / 可以选择指定元素的直接子元素。
    • 示例://div/p 选择所有 <div> 元素的直接子元素是 <p> 的元素。
  • 任意子孙选择符 :
    • 使用任意子孙选择符 // 可以选择指定元素的所有后代元素,不论层级有多深。
    • 示例://div//p 选择所有 <div> 元素下的所有 <p> 元素。
  • 父元素关系:
    • 示例: 定位 <span> 元素的父级 <div> 元素。
    • XPath: //span/..
  • 兄弟元素关系:
    • 示例: 定位 <p> 元素后面紧邻的同级 <div> 元素。
    • XPath: //p/following-sibling::div[1]
  • 祖先元素关系:
    • 示例: 定位 <a> 元素的所有祖先元素。
    • XPath: //a/ancestor::*
  • 后代元素关系:
    • 示例: 定位 <ul> 元素中的所有后代 <li> 元素。
    • XPath: //ul/descendant::li
  • 定位同一父级的兄弟元素:
    • 示例: 定位一个 <li> 元素后的所有兄弟 <li> 元素。
    • XPath: //li/following-sibling::li
  • 定位同一父级的前面的兄弟元素:
    • 示例: 定位一个 <h2> 元素前的所有兄弟 <p> 元素。
    • XPath: //h2/preceding-sibling::p