首页 > 其他分享 >一文搞懂XPath查找html dom

一文搞懂XPath查找html dom

时间:2024-09-25 08:54:08浏览次数:9  
标签:XPath dom 元素 选取 book bookstore 搞懂 节点 表达式

 博主介绍: 大家好,我是Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。
技术范围: 目前专注java体系,以及golang、.Net、软件架构、DDD、微服务、redis、nginx、tomcat、mysql、oracle等
业务范围: 从数字医院到区域医疗,从院内业务系统到互联网医院及健康服务,从公立医院到私立医院都有一些经历及理解
*** 为大家分享一些技术积累,欢迎交流合作 持续关注Yuperman ***

目录

XPath 路径表达式

XPath 标准函数

选取节点愈发

谓语(Predicates)

选取未知节点

选取若干路径

Xpath查找DOM

相对定位

​编辑绝对路径

last()方法

属性查找@

xpath逻辑表达式-and

xpath表达式-or

样式属性查找控件

Not查找

模糊匹配

精准匹配

使用大于小于符号定位

轴方式定位


XPath 路径表达式

XPath 使用路径表达式来选取 html页面的dom中的元素或者元素集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

  1.  选取 html页面的dom中的元素或者元素集
  2. 选取xml中的元素或者元素集

XPath 标准函数

XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。

选取节点愈发

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:

表达式描述
nodename选取此节点的所有子节点。
/从根节点选取(取子节点)。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式结果
bookstore选取所有名为 bookstore 的节点。
/bookstore

选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。


谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]//title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。


选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。


选取若干路径

通过在路径表达式中使用"|"运算符,您可以选取若干个路径。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式

结果
//book/title | //book/price选取 book 元素的所有 title 和 price 元素。
//title | //price选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

Xpath查找DOM

相对定位

相对定位是两个杠表示“//”,相对路径易维护


绝对路径

绝对定位用一个杠“/”, 绝对路径一个层级变化所有空间都有变化

/html/body/div[1]/section/section/main/div[2]/div[2]/div[1]/div[2]/button[1]/span

last()方法


当标签存在多个相同的时候,可以使用xpath中的last()方法,定位到最后一个

//标签名[last()]
//span/ul//li[last()]

//标签名[last()-1]
//span/ul//li[last()-1]

属性查找@

如,这里我们以百度为例,如果我们要定位到百度的id元素,那么可以使用 //标签名[@元素名称=‘元素值’]

 //标签名[@元素名称='元素值']
//input[@id='kw']

xpath逻辑表达式-and

当一个元素无法定位到唯一值得时候,我们可以使用and表达式,同一个标签下定位多个元素


//标签名[@元素名称='元素值' and @元素名称='元素值']
//input[@id='kw' and @class='s_ipt']

xpath表达式-or

xpath 中 or的表达式和and很像,指的是当你元素满足其中一个条件的时候,就可以定位到,如图,在百度搜索框中,我们故意将@class='s_t’元素写错,内容中并没有这个元素,

 

// 标签名[@元素名称='元素值' or @元素名称='元素值']
//input[@id='kw' or @class='s_t']

样式属性查找控件

如图,如果我们想要查找元素值不等于某个值的内容,可以使用!=方法,但是这个方法在工作中用的比较少,目前我还没有用到过,不过xpath提供了这个方法,可以结合场景使用~

//标签名称[@元素名称 != '元素值']
//input[@class!='1111']

Not查找

//标签名[not(.='元素值')
//year[not(.=2005)]
//div[not(@id="tab-AndroidVersions")]

这里没有找到合适的场景,意思就是查找year内容不为2005的内容 注:“.”就等于text()

模糊匹配

//标签名[contains(text(), "内容"]
//div[contains(text(), "更新")]

这里的意思是模糊查询内容包含“更新”的元素

精准匹配

//标签名[(text()='内容')]
//div[(text()='更新文案')]

使用大于小于符号定位

//div[@class="cell" and text()>'1336']
//div[@class="cell" and text()<'1336']

如图,当我们商品列表中有多个商品ID,那我们想要定位到ID大于或者小于1336的数据,可以通过上面的方式。

轴方式定位

轴表达式说明

parent::* :表示当前节点的父节点元素

ancestor::* :表示当前节点的祖先节点元素

child::* :表示当前节点的子元素 /A/descendant::* 表示A的所有后代元素

self::* :表示当前节点的自身元素

ancestor-or-self::* :表示当前节点的及它的祖先节点元素

descendant-or-self::* :表示当前节点的及它们的后代元素

following-sibling::* :表示当前节点的后序所有兄弟节点元素

preceding-sibling::* :表示当前节点的前面所有兄弟节点元素

following::* :表示当前节点的后序所有元素

preceding::* :表示当前节点的所有元素
  1. parent:: 当前节点的父节点元素*

//div[@class="cell" and text()='1338']/parent::*

如图,我们要定位到ID为1338元素的父节点元素,可以使用如上xpath轴定位, “*” 表示匹配所有

  1. following-sibling::
/bookstore/book[1]/following-sibling::*

查找books1所有的同级元素都查找出来,“*”表示所有

//div[3]/table/tbody/tr[1]/td[1]/following-sibling::td[2]

查找td[1]下同级节点下的第二个节点


3. following-sibling::当前节点的前面所有兄弟节点元素

/bookstore/book[2]/year/preceding-sibling::*

意思是:查找books[2]下year前的同级节点

  1. 查找节点的父辈
/bookstore/book[2]/year/parent::*
  1. 查找节点的子辈
/bookstore/book[2]/descendant::*

使用position位置定位

意思是定位到th标签下的第一个

//th[@class="c-id " and position()=1]

标签:XPath,dom,元素,选取,book,bookstore,搞懂,节点,表达式
From: https://blog.csdn.net/charry0110/article/details/142502336

相关文章

  • 彻底搞懂回溯算法
    1.回溯算法的核心思想回溯算法的核心思想是:尝试+记录+回退。先尝试一种选项,在选择该选项的前提下继续寻解,如果最后寻解成功,则记录这个解,否则不用记录,然后再回退到选择该选项前的状态,改为尝试其它选项再继续寻解,判断其它选项是不是解。2.回溯算法的关键点回溯算法用于寻找全部......
  • 领域驱动设计(Domain-Driven Design, DDD)
    目录核心概念实践原则领域驱动设计(Domain-DrivenDesign,DDD)是一种软件开发方法论,它强调将业务领域知识与软件实现紧密结合,以提高软件对于复杂业务需求的适应性和可维护性。DDD由埃里克·埃文斯(EricEvans)在其2003年出版的同名书籍《领域驱动设计》中首次提出,并逐渐成为处理复......
  • 万象更新 Html5 - dom: DOM 获取元素,修改元素的样式
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-dom:DOM获取元素,修改元素的样式示例如下:dom\demo1.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>DOM获取元素,修改元素的样式</t......
  • 万象更新 Html5 - dom: DOM 常用方法和属性
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-dom:DOM常用方法和属性示例如下:dom\demo2.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>DOM常用方法和属性</title>&......
  • 万象更新 Html5 - dom: DOM 事件
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-dom:DOM事件示例如下:dom\demo3.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>DOM事件</title><sty......
  • 万象更新 Html5 - dom: DOM scroll
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-dom:DOMscroll示例如下:dom\demo4.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>DOMscroll</title>......
  • js DOM学习的综合样例
    jsDOM学习的综合样例本人简单学习了一点md语法,写出来的博客会更好看喵.样例介绍主要实现利用DOM的获取标签对象的功能和对监听功能实现三个功能:(1)开灯,关灯(2)对标签进行全选,反选(3)对文本框聚焦时字母为大写,反之为小写基本实现方法(1)开灯关灯:a.......
  • 20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理
    ContainerLess理念微服务把应用和它所依赖的组件包、配置文件及附带的运行脚本打包成一个单一、独立、可执行的jar包文件。在实现Web服务器时,几乎不需要任何配置就可以启动Tomcat。你只需要使用java-jar命令就可以让Tomcat成为SpringBoot的一个自包含的可运行组件和单元。同时,这......
  • Js DOM(2)
    (1).在DOM将各个标签分成很多类,实现了编程对象进行管理.通过id,name,class,等等的方式可以快速获取到对象.(2).获取对象之后可以对对象的各个属性进行修改,从而实现页面的调整,下面是一个样例开关灯,和全选反选(3)这需要用到事件的监听功能实现监听有两种方式:a.给对象的属......
  • 一文搞懂软著申请细则!
    在开发完一个系统后,若需申请软著,需要准备以下材料(模版):(一)开发合同协议https://pan.baidu.com/s/1AMj6bI7F1uiKm-qVt2g4Vw 提取码:6666(二)程序鉴别材料https://pan.baidu.com/s/1wohFGeSwyAR7jWUzDHTXgA 提取码:6666(三)文档鉴别材料https://pan.baidu.com/s/19mxZf2Fwdd2......