[Web自动化] HTML元素的定位(Xpath)

3.4 HTML元素的定位(Xpath)

XPath(XML Path Language)是一种用于在XML文档中查找信息的语言,它同样可以应用于HTML文档,因为HTML可以视作XML的一个子集(尽管不是所有HTML文档都是格式良好的XML)。

3.4.1 定义与功能

定义:XPath是一种基于XML的树状结构,用于确定XML文档中某部分位置的语言。它使用路径表达式来选取XML文档中的节点或者节点集。
功能:XPath允许用户通过元素和属性的名称,以及它们的层次关系来定位XML文档中的信息。这使得XPath成为处理复杂XML或HTML文档时的一个非常有用的工具。

3.4.2 工作原理

路径表达式:XPath使用路径表达式来选取XML文档中的节点。这些路径表达式与常规的计算机文件系统中看到的路径非常相似,代表着从一个节点到另一个或者一组节点的顺序。路径表达式是从一个XML节点(当前的上下文节点)到另一个节点、或一组节点的书面步骤顺序。
运算符与函数:XPath含有超过100个内建的函数,这些函数用于字符串值数值日期时间比较、节点Qname处理、序列处理逻辑值等等。XPath还使用一系列的运算符来组合路径表达式,以实现更复杂的查询。

3.4.3 特点与优势

灵活性:XPath可以用于定位和选择XML文档中的任何节点,无论节点的层次结构如何复杂,可以根据节点的名称、属性、位置等多种条件来进行选择。
简洁性:XPath的语法相对简单明了,路径表达式直观且易于理解。使用XPath可以很容易地定位到所需的节点,而无需编写复杂的代码。
强大性:XPath支持大部分的节点选择、轴定位和运算符操作,可以实现更加复杂和精确的节点筛选和处理。XPath还支持函数的使用,可以进行数值计算、字符串处理等操作。
跨平台性:XPath是一种标准的查询语言,不仅用于XML文档,还可用于HTML和其他基于XML的数据格式。因此,XPath可以在不同的平台和环境中使用,以实现对不同类型的数据进行查询和处理。

3.4.4 应用场景

Web自动化测试:XPath提供了一种强大的定位方式,能够通过元素的层次结构、属性、文本内容等进行更加灵活和精准的定位,适用于各种复杂的Web应用页面。
数据抓取:XPath常与编程语言结合使用,如Python、Java等,用于从网页或其他XML/HTML源中抓取所需的数据。
XML处理:在需要处理XML文档的场景中,XPath是不可或缺的工具,它允许用户以高效、准确的方式定位和提取文档中的信息。

XPath的语法非常灵活,它允许你通过不同的方式来定位XML或HTML文档中的元素。下面我将详细解释XPath的一些基本语法,并给出几个实例。

3.4.5 XPath 语法基础

XPath 表达式通常由以下几个部分组成:
节点名称:用于选取指定名称的节点。例如,div 会选取所有的 <div> 元素。
属性:用于基于属性值来选取节点。属性名前面需要加 @ 符号。例如,[@id="kw"] 会选取所有具有 id 属性且其值为 kw 的节点。
通配符:* 代表任意节点名称。例如,* 会选取所有节点,//* 会选取文档中的所有元素节点(不论层级)。
轴(Axes):用于在XML文档中沿着特定的方向或路径选取节点。例如,child::(可以简写为/)表示子节点,parent:: 表示父节点等。不过,在简单的XPath表达式中,轴通常不是必需的,因为路径表达式本身已经隐含了方向。
谓词(Predicates):用于过滤节点集。谓词被放在方括号中,并且紧跟在节点选择器之后。例如,[1] 会选取第一个节点,[@class="example"] 会选取所有具有 class 属性且其值为 example 的节点。

3.4.5.1 条件表达式

一、XPath条件表达式的基本构成

XPath条件表达式主要由以下部分构成:
路径表达式:用于指定从文档的哪个部分开始选择节点。可以是绝对路径(从根节点开始)或相对路径(从当前节点或上下文节点开始)。
条件筛选:在路径表达式中,可以使用方括号[]来添加条件筛选。这些条件用于进一步限制选择的节点集,使其只包含满足特定条件的节点。
比较运算符:在条件筛选中,可以使用各种比较运算符(如=、!=、<、>、<=、>=)来比较节点的属性值或文本内容与指定的值。
逻辑运算符:XPath还支持逻辑运算符(如and、or、not),这些运算符可以用于组合多个条件,以实现更复杂的逻辑判断。
函数:XPath还提供了丰富的函数库,这些函数可以用于在条件表达式中执行各种操作,如字符串处理、数值计算、日期时间处理等。
二、XPath条件表达式的示例

以下是一些XPath条件表达式的示例:

//input[@type='text']:选择文档中所有type属性值为text的元素。

//p[text()='Hello World']:选择文档中所有文本内容等于Hello World的

元素。

//book[@category='fiction' and @year='2020']:选择文档中所有category属性值为fiction且year属性值为2020的元素。

//book[starts-with(@title, 'The')]:这个表达式使用starts-with函数选择所有标题以The开头的<book>元素。
三、注意事项
路径表达式的准确性:确保路径表达式正确地指向了文档的相应部分,否则条件表达式可能无法正确工作。
条件筛选的严谨性:在添加条件筛选时,要确保条件能够准确地描述所需选择的节点集。
XPath版本兼容性:不同版本的XPath在功能和语法上可能有所不同。在使用特定功能时,请注意检查其是否兼容您所使用的XPath版本。
性能考虑:复杂的XPath表达式可能会对性能产生影响。在可能的情况下,尽量使用简单且高效的表达式来定位节点。

3.4.5.2 绝对路径定位

定义:

绝对路径是指从文档的根节点(如HTML文档的<html>节点或XML文档的根元素)开始的完整路径。
特点:

绝对路径以斜杠(/)开头,表示从根节点开始遍历。路径中包含了从根节点到目标节点之间的所有中间节点。绝对路径表达明确,能够准确地定位到目标节点,但它依赖于文档的完整结构。
示例:

/html/body/div/p:表示从<html>根节点开始,依次通过<body><div>,最后到达<p>节点。

/html/body/div[1]/input[1]

/html/body/div[1]/input[@value="查询"]

3.4.5.3 相对路径定位

定义:

相对路径是指相对于当前节点的路径。它不需要从根节点开始,而是从当前节点或上下文节点出发,选择目标节点。
特点:

相对路径更加灵活和简洁,因为它不需要知道完整的文档结构。它通常用于定位当前节点的子节点、兄弟节点或父节点。

在XPath中,相对路径可能以点(.)双斜杠(//)开头。点(.)表示当前节点,但通常省略;双斜杠(//)表示从当前节点开始,选择任意位置的节点,忽略层级关系。
示例:

./div/p表示从当前节点开始,选择当前节点的直接子节点中所有的<div>元素,并进一步选择这些<div>元素下的<p>元素。但通常省略点(.),直接写为/div/p(这里实际上更接近于绝对路径的一部分,如果单独使用则意味着从根节点开始,但在此作为相对路径示例的说明)。

//div/p表示从当前节点开始,选择文档中任意位置的<div>元素下的<p>元素,忽略它们之间的层级关系。

//input[@value="查询"]:查找第一个input,并且value="查询"的元素

//div[last()]:定位最后一个div

//div[last()-1]:定位倒数第二个div

//div/input[position()<2]:position()函数获取当前元素input的位置的序列号

3.4.5.4 实例

选取具有特定ID的元素:

//*[@id="kw"]

这个表达式会选取文档中所有具有 id 属性且其值为 kw 的元素,不论它们位于哪个层级。
选取特定类名的元素:

//div[@class="content"]

这个表达式会选取文档中所有 <div> 元素,这些 <div> 元素必须具有 class 属性且其值为 content。
选取第一个特定元素:

//ul[1]

这个表达式会选取文档中的第一个 <ul> 元素。
选取所有特定父元素下的特定子元素:

//div/p

这个表达式会选取所有 <div> 元素下的直接子 <p> 元素。
选取所有特定父元素下的特定子孙元素:

//div//p

这个表达式会选取所有 <div> 元素下的直接子孙 <p> 元素。
选取具有特定文本内容的元素:

XPath标准表达式中直接按文本内容选择节点并不直接支持,但可以通过contains()函数等方式实现类似功能:

//a[contains(text(), '链接文本')]

这个表达式会选取所有 <a> 元素,这些元素的文本内容包含链接文本
选取具有特定属性值的元素的直接子元素:

//div[@id="main"]/p

这个表达式会选取 id 属性为 main 的 <div> 元素下的所有直接子 <p> 元素。
选取符合多条件的元素

//input[@id='aa1' and @class='bb1']

选取id属性为aa1并且class属性为bb1的input元素
模糊属性值定位

//img[starts-with(@alt,div1)]:使用了starts-with(str1,str2)函数,查找属性alt的属性值以div1关键字开始的页面元素

//img[contains(@alt, img)]:使用了contains(str1,str2)函数,查找属性alt的属性值包含img关键字的页面元素。
页面元素的文本定位

//a[text()=搜狗搜索] = //a[.=搜狗搜索]:完全匹配

//a[contains(.,百度)] = //a[contains(text(),百度)]:模糊匹配
注意

XPath表达式是大小写敏感的,因此在编写XPath时需要注意元素和属性名称的大小写。

XPath的完整功能和语法可能因不同的XPath处理器或库而异,但上述示例涵盖了XPath中最常用和最基本的功能。

在使用XPath时,确保你的目标文档是格式良好的XML或HTML,因为XPath是基于这些文档的树状结构来工作的。对于非标准的HTML文档,XPath的行为可能会有所不同。

3.4.5.5 总结

网站:

https://www.baidu.com/

目标元素:

/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input

元素内容:

一、绝对路径(以/开头):

1、完整路径:

/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input

2、非完整路径:

/html//input[@id="kw"]

/html//[@id="kw"]
//input[@id="kw"]
//
[@id="kw"]
二、相对路径(以.开头):

假设已经定位到元素:/html/body/div[1]/div[1]/div[5]/div/div,在此基础上定位其内部元素:

1、完整路径

./form/span[1]/input

2、非完整路径:

./form//input[@id="kw"]

./form//[@id="kw"]
.//input[@id="kw"]
.//
[@id="kw"]

相关推荐
Justin3go6 小时前
HUNT0 上线了——尽早发布,尽早发现
前端·后端·程序员
怕浪猫7 小时前
第一章 JSX 增强特性与函数组件入门
前端·javascript·react.js
铅笔侠_小龙虾7 小时前
Emmet 常用用法指南
前端·vue
钦拆大仁7 小时前
跨站脚本攻击XSS
前端·xss
秃了也弱了。8 小时前
python实现定时任务:schedule库、APScheduler库
开发语言·python
Dfreedom.8 小时前
从 model(x) 到__call__:解密深度学习框架的设计基石
人工智能·pytorch·python·深度学习·call
weixin_425023008 小时前
Spring Boot 配置文件优先级详解
spring boot·后端·python
VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue校园社团管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
小徐Chao努力9 小时前
【Langchain4j-Java AI开发】06-工具与函数调用
java·人工智能·python
无心水9 小时前
【神经风格迁移:全链路压测】33、全链路监控与性能优化最佳实践:Java+Python+AI系统稳定性保障的终极武器
java·python·性能优化