『心善渊』Selenium3.0基础 — 7、XPath轴定位详解

目录

使用XPath轴方式,可根据文档中元素的相对位置,来进行元素的定位。例如:先找到一个相对好定位的元素,在根据与它的相对位置来定位其他元素,可以解决一些元素难以定位的问题。

1、XPath轴定位介绍

轴可理解为相对于当前节点的节点集。

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

2、位置路径表达式概念

位置路径可以是绝对的,也可以是相对的。

绝对路径起始于正斜杠(/),而相对路径不会这样。

在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:

(1)绝对位置路径

/step/step/...

(2)相对位置路径

//step/step/...

每个步均根据当前节点集之中的节点来进行计算。

(3)步(step)包括

  • 轴(axis):定义所选节点与当前节点之间的树关系(如上表)。
  • 节点测试(node-test):识别某个轴内部的节点(相当于标签节点或者标签节点集)。
  • 零个或者更多谓语(predicate):索引。

(4)步的语法

轴名称::节点测试[索引]

3、步的路径表达式范例

例子 结果
child::book 选取所有属于当前节点的子元素的 book 节点。
attribute::lang 选取当前节点的 lang 属性。
child::* 选取当前节点的所有子元素。
attribute::* 选取当前节点的所有属性。
child::text() 选取当前节点的所有文本子节点。
child::node() 选取当前节点的所有子节点。
descendant::book 选取当前节点的所有 book 后代。
ancestor::book 选择当前节点的所有 book 先辈。
ancestor-or-self::book 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)
child::*/child::price 选取当前节点的所有 price 孙节点。

4、练习

页面代码片段

<!DOCTYPE html>
<html lang="zh-cn">
<body>
<div id="zc">
    <legend>注册用户A</legend>
    <p id="p1">
        <label for="userA">账号A</label>
        <input type="textA" name="userA" id="userA" class="c_uA" placeholder="账号A" required="" value="">
    </p>
    <p>
        <label for="password">密码A</label>
        <input type="password" name="passwordA" id="passwordA" placeholder="密码A" value="">
    </p>
    <p><a href="http://www.sina.com.cn" id="fwA">访问 新浪 网站</a></p>
    <input type="emailA" name="emailA" id="emailA" placeholder="电子邮箱A" value="">
</div>
</body>
</html>

代码脚本

"""
1.学习目标:
    必须掌握selenium中轴定位方法
2.语法
    2.1 选择当前元素之后的同级元素
        语法://A/following-sibling::B
        说明:选择所有 A 元素之后同级的 B 元素。
    2.2 选择当前元素之前的同级元素
        语法://A/preceding-sibling::B
        说明:选择所有 A 元素之前同级的 B 元素。
    2.3 其他的轴定位关键字,可自己拓展练习。
3.需求
    在页面中,定位指定元素。
"""
# 1.导入selenium
from selenium import webdriver
from time import sleep
import os

# 2.打开浏览器
driver = webdriver.Chrome()

# 3.打开注册A页面
url = "file:///" + os.path.abspath("./1.html")
driver.get(url)

# 4.定位页面指定元素
# 4.1 选择当前元素之后的同级元素
# 选择所有<legend>标签之后的同级的<p>元素
elements_1 = driver.find_elements_by_xpath("//legend/following-sibling::p")
for element in elements_1:
    print(element.get_attribute("outerHTML"))

# 4.2 选择当前元素之前的同级元素
# 选择所有<input>之前的同级的<p>元素
elements_2 = driver.find_elements_by_xpath("//input/preceding-sibling::p")
for element in elements_2:
    print(element.get_attribute("outerHTML"))


# 5.关闭浏览器
sleep(2)
driver.quit()
"""
输出结果:
打印两次如下内容
<p id="p1">
    <label for="userA">账号A</label>
    <input type="textA" name="userA" id="userA" class="c_uA" placeholder="账号A" required="" value="">
</p>
<p>
    <label for="password">密码A</label>
    <input type="password" name="passwordA" id="passwordA" placeholder="密码A" value="">
</p>
<p><a href="http://www.sina.com.cn" id="fwA">访问 新浪 网站</a></p>
"""
上一篇:Selenium的使用


下一篇:Python 爬虫必杀技:XPath