热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XPathCSS元素定位一篇搞定

文章目录1.XPath与CSSselector的对比2.XPath定位详情(1)基本符号的介绍(2)轴(Axi

文章目录

    • 1.XPath 与 CSS selector 的对比
    • 2.XPath定位详情
      • (1)基本符号的介绍
      • (2)轴(Axis)定位
      • (3)xpath 常用的表达式
    • 3.CSS定位详情






1.XPath 与 CSS selector 的对比


描述XPathCSS selector
父元素//div/.
使用ID定位//div[@id=‘id_value’]div#id_value
使用class定位//div[@class=‘class_value’]div.class_value
使用name定位//div[@name=‘name_value’]div[name=‘name_value’]
多属性定位//div[@name=‘name_value’ and class=‘class_value’]div[@name=‘name_value’] [class=‘class_value’]
第N个子元素//ul[@id=‘id_value’]/li[4]u#id_val li:nth-child(4)
最后一个元素//ul[@id=‘id_value’]/li[last()]u#id_val li:last-child
属性包含某字段//div[contains(@title, “text”)]div[title*=“text”]
属性以xxx开头//div[starts-with(@title, “text”)]div[title^=“text”]
属性以xxx结尾//div[ends-with(@title, “text”)]div[title$=“text”]
text中包含某字段//div[contains(text(), “text”)] 。
凡是用text()的地方均可以直接用.来进行表示。
例如a[text()=’SELENIUM’] 和 a[.=’SELENIUM’]是等价的。
同级弟弟元素//div[@id=‘D’]/following-sibling::div[1]
同级哥哥元素//li/preceding-sibling::div[1]





2.XPath定位详情






(1)基本符号的介绍


XPath运算符说明
/此路径运算符出现在模式开头时,表示应从根节点选择。
//是指从全文上下文中搜索//后面的节点
.//从当前节点开始递归下降。此路径运算符出现在模式开头时,表示应从根节点递归下降。
.当前上下文。
当前上下文节点父级。
*通配符;选择所有元素节点与元素名无关。(不包括文本,注释,指令等节点,如果也要包含这些节点请用node()函数)
@属性名的前缀。
@*选择所有属性,与名称无关。
:命名空间分隔符;将命名空间前缀与元素名或属性名分隔。
( )括号运算符(优先级最高),强制运算优先级。
[ ]应用筛选模式(即谓词,包括"过滤表达式"和"轴(向前/向后)")。
[ ]下标运算符;用于在集合中编制索引。
-减法。
div浮点除法。
and, or逻辑运算。
mod求余。
not()逻辑非
=等于
!=不等于
特殊比较运算符<或者 <&#61; 或者 > 或者 >&#61;
normalize-space去掉文字前后的空格、回车&#xff0c;.//a[normalize-space(text())&#61;‘XXXXX’]





&#xff08;2&#xff09;轴&#xff08;Axis&#xff09;定位


XPath轴名称说明
ancestor选取当前节点的所有先辈&#xff08;父、祖父等&#xff09;
ancestor-or-self选取当前节点的所有先辈&#xff08;父、祖父等&#xff09;以及当前节点本身
attribute选取当前节点的所有属性
child选取当前节点的所有子元素。
descendant选取当前节点的所有后代元素&#xff08;子、孙等&#xff09;。
descendant-or-self选取当前节点的所有后代元素&#xff08;子、孙等&#xff09;以及当前节点本身。
following选取文档中当前节点的结束标签之后的所有节点。
namespace选取当前节点的所有命名空间节点
parent选取当前节点的父节点。
preceding直到所有这个节点的父辈节点&#xff0c;顺序选择每个父辈节点前的所有同级节点
preceding-sibling选取当前节点之前的所有同级节点。
self选取当前节点。





&#xff08;3&#xff09;xpath 常用的表达式


常用表达式举例说明
/Document Root文档根.
/*选择文档根下面的所有元素节点&#xff0c;即根节点&#xff08;XML文档只有一个根节点&#xff09;
/node()根元素下所有的节点&#xff08;包括文本节点&#xff0c;注释节点等&#xff09;
/text()查找文档根节点下的所有文本节点
/messages/messagemessages节点下的所有message节点
/messages/message[1]messages节点下的第一个message节点
/messages/message[1]/self::node()第一个message节点&#xff08;self轴表示自身&#xff0c;node()表示选择所有节点&#xff09;
/messages/message[1]/node()第一个message节点下的所有子节点
/messages/message[1]/*[last()]第一个message节点的最后一个子节点
/messages/message[1]/[last()]Error&#xff0c;谓词前必须是节点或节点集
/messages/message[1]/node()[last()]第一个message节点的最后一个子节点
/messages/message[1]/text()第一个message节点的所有子节点
/messages/message[1]//text()第一个message节点下递归下降查找所有的文本节点&#xff08;无限深度&#xff09;
/messages/message[1] /child::node()第一个message节点下的所有子节点
/messages/message[1] /node()第一个message节点下的所有子节点
/messages/message[position()&#61;1]/node()第一个message节点下的所有子节点
//message[&#64;id&#61;1] /node()第一个message节点下的所有子节点
//message[&#64;id&#61;1] //child::node()递归所有子节点&#xff08;无限深度&#xff09;
//message[position()&#61;1]/node()选择id&#61;1的message节点以及id&#61;0的message节点
/messages/message[1] /parent:: *Messages节点
/messages/message[1]/body/attachments/parent::node()attachments节点的父节点。父节点只有一个&#xff0c;所以node()和* 返回结果一样。
/messages/message[1]/body/attachments/parent:: *attachments节点的父节点。父节点只有一个&#xff0c;所以node()和* 返回结果一样。
/messages/message[1]/body/attachments/. .attachments节点的父节点。
//message[&#64;id&#61;0]/ancestor:: *Ancestor轴表示所有的祖辈&#xff0c;父&#xff0c;祖父等。 向上递归
//message[&#64;id&#61;0]/ancestor-or-self:: *向上递归,包含自身
//message[&#64;id&#61;0]/ancestor::node()对比使用*,多一个文档根元素(Document root)
/messages/message[1]/descendant::node()递归下降查找message节点的所有节点
//messages/message[1]//node()递归下降查找message节点的所有节点
/messages/message[1]/sender/following:: *查找第一个message节点的sender节点后的所有同级节点&#xff0c;并对每一个同级节点递归向下查找。
//message[&#64;id&#61;1]/sender/following-sibling:: *查找id&#61;1的message节点的sender节点的所有后续的同级节点。
//message[&#64;id&#61;1]/datetime/&#64;date查找id&#61;1的message节点的datetime节点的date属性
//message[&#64;id&#61;1]/datetime[&#64;date]查找id&#61;1的message节点的所有含有date属性的datetime节点
//message/datetime[attribute::date]查找message节点的所有含有date属性的datetime节点
//message[datetime]查找所有含有datetime节点的message节点
//message/datetime/attribute:: *返回message节点下datetime节点的所有属性节点
//message/datetime/attribute::node()返回message节点下datetime节点的所有属性节点
//message/datetime/&#64;*返回message节点下datetime节点的所有属性节点
//message/datetime[attribute:: *]选择所有含有属性的datetime节点
//message/datetime[attribute::node()]选择所有含有属性的datetime节点
//message/datetime[&#64;*]选择所有含有属性的datetime节点
//message/datetime[&#64;node()]选择所有含有属性的datetime节点
//attribute:: *选择根节点下的所有属性节点
//message[&#64;id&#61;0]/body/preceding::node()顺序选择body节点所在节点前的所有同级节点。&#xff08;查找顺序为&#xff1a;先找到body节点的顶级节点&#xff08;根节点&#xff09;,得到根节点标签前的所有同级节点&#xff0c;执行完成后继续向下一级&#xff0c;顺序得到该节点标签前的所有同级节点&#xff0c;依次类推。&#xff09; 注意&#xff1a;查找同级节点是顺序查找&#xff0c;而不是递归查找。
//message[&#64;id&#61;0]/body/preceding-sibling::node()顺序查找body标签前的所有同级节点。&#xff08;和上例一个最大的区别是&#xff1a;不从最顶层开始到body节点逐层查找。我们可以理解成少了一个循环&#xff0c;而只查找当前节点前的同级节点&#xff09;
//message[&#64;id&#61;1]//*[namespace::amazon]查找id&#61;1的所有message节点下的所有命名空间为amazon的节点。
//namespace:: *文档中的所有的命名空间节点。&#xff08;包括默认命名空间xmlns:xml&#xff09;
//message[&#64;id&#61;0]//books/*[local-name()&#61;‘book’]选择books下的所有的book节点&#xff0c; 注意&#xff1a;由于book节点定义了命名空间amazone:book.若写成//message[&#64;id&#61;0]//books/book则查找不出任何节点。
//message[&#64;id&#61;0]//books/*[local-name()&#61;‘book’ and namespace-uri()&#61;‘http://www.amazon.com/books/schema’]选择books下的所有的book节点&#xff0c;(节点名和命名空间都匹配)
//message[&#64;id&#61;0]//books/*[local-name()&#61;‘book’][year>2006]选择year节点值>2006的book节点
//message[&#64;id&#61;0]//books/*[local-name()&#61;‘book’][1]/year>2006指示第一个book节点的year节点值是否大于2006. 返回xs:boolean: true





3.CSS定位详情


CSS选择器示例说明CSS
.class.intro选择 class&#61;“intro” 的所有元素。1
#id#firstname选择 id&#61;“firstname” 的所有元素。1
**选择所有元素。2
elementp选择所有

元素。

1
element,elementdiv,p选择所有
元素和所有

元素。

1
element elementdiv p选择
元素内部的所有

元素。

1
element>elementdiv>p选择父元素为
元素的所有

元素。

2
element&#43;elementdiv&#43;p选择紧接在
元素之后的所有

元素。

2
[attribute][target]选择带有 target 属性所有元素。2
[attribute&#61;value][target&#61;_blank]选择 target&#61;“_blank” 的所有元素。2
[attribute~&#61;value][title~&#61;flower]选择 title 属性包含单词 “flower” 的所有元素。2
[attribute&#61;value][lang&#61;en]
:linka:link选择所有未被访问的链接。1
:visiteda:visited选择所有已被访问的链接。1
:activea:active选择活动链接。1
:hovera:hover选择鼠标指针位于其上的链接。1
:focusinput:focus选择获得焦点的 input 元素。2
:first-letterp:first-letter选择每个

元素的首字母。

1
:first-linep:first-line选择每个

元素的首行。

1
:first-childp:first-child选择属于父元素的第一个子元素的每个

元素。

2
:beforep:before在每个

元素的内容之前插入内容。

2
:afterp:after在每个

元素的内容之后插入内容。

2
:lang(language)p:lang(it)选择带有以 “it” 开头的 lang 属性值的每个

元素。

2
element1~element2p~ul选择前面有

元素的每个

    元素。
3
[attribute^&#61;value]a[src^&#61;“https”]选择其 src 属性值以 “https” 开头的每个 元素。3
[attribute$&#61;value]a[src$&#61;“.pdf”]选择其 src 属性以 “.pdf” 结尾的所有 元素。3
[attribute*&#61;value]a[src*&#61;“abc”]选择其 src 属性中包含 “abc” 子串的每个 元素。3
:first-of-typep:first-of-type选择属于其父元素的首个

元素的每个

元素。

3
:last-of-typep:last-of-type选择属于其父元素的最后

元素的每个

元素。

3
:only-of-typep:only-of-type选择属于其父元素唯一的

元素的每个

元素。

3
:only-childp:only-child选择属于其父元素的唯一子元素的每个

元素。

3
:nth-child(n)p:nth-child(2)选择属于其父元素的第二个子元素的每个

元素。

3
:nth-last-child(n)p:nth-last-child(2)同上&#xff0c;从最后一个子元素开始计数。3
:nth-of-type(n)p:nth-of-type(2)选择属于其父元素第二个

元素的每个

元素。

3
:nth-last-of-type(n)p:nth-last-of-type(2)同上&#xff0c;但是从最后一个子元素开始计数。3
:last-childp:last-child选择属于其父元素最后一个子元素每个

元素。

3
:root:root选择文档的根元素。3
:emptyp:empty选择没有子元素的每个

元素&#xff08;包括文本节点&#xff09;。

3
:target#news:target选择当前活动的 #news 元素。3
:enabledinput:enabled选择每个启用的 元素。3
:disabledinput:disabled选择每个禁用的 元素。3
:checkedinput:checked选择每个被选中的 元素。3
:not(selector):not§选择非

元素的每个元素。

3
::selection::selection选择被用户选取的元素部分。3





部分内容来源&#xff1a;
1.https://blog.csdn.net/weixin_40326608/article/details/101202935


推荐阅读
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 深入解析 Android Drawable:第六阶段进阶指南 ... [详细]
author-avatar
kyijhx
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有