热门标签 | 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源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了如何在Mac上使用Pillow库加载不同于默认字体和大小的字体,并提供了一个简单的示例代码。通过该示例,读者可以了解如何在Python中使用Pillow库来写入不同字体的文本。同时,本文也解决了在Mac上使用Pillow库加载字体时可能遇到的问题。读者可以根据本文提供的示例代码,轻松实现在Mac上使用Pillow库加载不同字体的功能。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
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社区 版权所有