XPath如何匹配多个节点?

冬涛君_6047

冬涛君_6047

2025-09-10

931人浏览

原创

XPath能匹配多个节点,通过标签名、属性、位置、通配符及联合操作符|等方式实现。例如//a选所有链接,//div[@class='product-item']选特定class的div,//h1|//h2|//h3选多种标题。使用谓词可精确筛选,如//div[contains(@class,'product-card')]匹配含特定class的元素,//a[starts-with(@href,'/products/')]匹配指定href的链接。结合and、or可组合多条件,如//input[@type='text' or @type='email']。轴(axes)用于关系定位,如//h2[text()='产品列表']/following-sibling::ul/li可选特定标题后的列表项。这些方法使XPath能高效批量定位复杂结构中的节点。

xpath如何匹配多个节点?

XPath在处理XML或HTML文档时,其核心能力之一就是能够轻松地匹配和返回多个节点。它并不是一个“是否能”的问题,而更多是“如何更精确、更高效地”选择你所需的一组节点。无论是寻找页面上所有链接、所有特定类型的段落,还是那些满足复杂条件的数据项,XPath都提供了丰富的语法和操作符来达成这个目标。

要匹配多个节点,XPath提供了多种策略,具体选择哪种取决于你的目标和文档结构。最直接的方式是选择所有同名元素,比如

//a

会选中文档中所有的

<a></a>

标签。但我们往往需要更细致的筛选。

  • 基于标签名和位置: 如果想选前三个
    
    
  • 元素,可以尝试
    //ul/li[position() 。
  • 基于属性: 比如,我们经常需要抓取所有带有特定class的元素,如
    //div[@class='product-item']
    ,这会返回所有class为
    product-item
    的
    div
    。
  • 使用通配符:
    //*
    会匹配文档中的所有元素,而
    //div/*
    则会匹配所有
    div
    元素下的直接子元素。这在探索文档结构时很有用,但通常不建议用于精确数据提取,因为它会带来大量无关节点。
  • 联合操作符
    |
    :
    当你需要同时匹配几种不同类型的节点时,
    |
    操作符非常强大。比如,
    //h1 | //h2 | //h3
    可以一次性获取所有一级、二级、三级标题。
  • 文本内容匹配:
    //p[contains(text(), '关键词')]
    可以找到所有包含特定关键词的段落。

这些只是冰山一角,XPath的强大之处在于其组合能力,通过将这些基本选择器与谓词、轴(axes)结合,几乎可以定位任何你想要的节点集合。

XPath中如何精确选择具有特定属性的多个元素?

这个需求在实际工作中太常见了,简直是XPath的“基本功”之一。我们经常会遇到这样的场景:页面上有很多

div

,但只有那些

class

属性是

product-card

的才是我想要的商品信息;或者,我想找到所有

href

属性包含

category

字样的链接。

要精确选择,关键在于使用谓词(Predicates)。谓词用方括号

[]

包裹,紧跟在节点测试(node test)之后。

最直接的是完全匹配属性值:

//div[@class='product-card']

这会返回文档中所有

class

属性值恰好是

product-card

的

div

元素。注意,如果一个

div

有多个

class

,例如

<div class="product-card featured">
<p>,这种写法是匹配不到的。这时就需要 </p>
<pre class="brush:php;toolbar:false;">contains()

函数。

使用

contains()
函数进行模糊匹配:

//div[contains(@class, 'product-card')]

这样就能匹配到所有

class

属性值中包含

product-card

子串的

div

元素,比如

product-card featured

或

featured product-card

都能被选中。这在处理动态生成的class名时尤其有用。

类似的,还有

starts-with()

和

ends-with()

(后者在XPath 1.0中不直接支持,但XPath 2.0+有):

//a[starts-with(@href, '/products/')]  // 匹配所有href以/products/开头的链接

当然,我们还可以组合多个条件,使用

htmlppt.skill
htmlppt.skill

把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。

下载
and

或

or

:

//a[@target='_blank' and contains(@href, 'external')] // 匹配所有在新窗口打开且链接包含'external'的a标签
//input[@type='text' or @type='email'] // 匹配所有type是text或email的input标签

通过这些组合,你可以构建出非常精细的筛选逻辑,从一大堆节点中精准地“捞”出你真正需要的那一部分。这就像在图书馆里,你不只是找“书”,而是找“作者是XX,出版年份在YY之后,并且书名包含ZZ关键词”的书。

当需要匹配不同类型的元素时,XPath的联合操作符如何使用?

有时候,我们的需求不是“所有

div

里的

p

”,而是“所有标题和所有列表项”,或者“所有错误信息和所有警告信息”。这些节点可能在文档结构中相距甚远,标签名也各不相同,但它们在逻辑上属于同一类信息,需要一起处理。这时,XPath的联合操作符

|
就显得尤为重要,它允许你将多个独立的XPath表达式的结果合并成一个节点集。

想象一下,你正在解析一个新闻页面,想抓取所有标题(可能是

h1

,

h2

,

h3

)和所有主要内容段落(

p

标签,但可能只有

class='article-body'

的)。如果一个一个去取,那代码会显得重复且效率不高。

使用

|

操作符可以这样写:

//h1 | //h2 | //h3 | //p[@class='article-body']

这个表达式会返回一个节点集,其中包含了所有匹配到的

h1

、

h2

、

h3

元素,以及所有

class

属性为

article-body

的

p

元素。这些节点在返回时通常会按照它们在原始文档中的顺序排列,这对于后续处理来说非常方便。

我个人在做一些内容聚合时,经常会用到这个技巧。比如,要从一个复杂的HTML页面中提取所有“显眼”的文本内容,我可能会这样组合:

//h1 | //h2 | //h3 | //h4 | //p[string-length(normalize-space(.)) > 50] | //li[string-length(normalize-space(.)) > 30]

这里我甚至加入了

string-length()

和

normalize-space()

函数,来过滤掉那些过短或只有空白的段落和列表项,确保抓取到的内容有实际意义。这种灵活性是

|

操作符的魅力所在。

需要注意的是,

|

操作符连接的每个部分本身都必须是一个有效的XPath表达式,并且它们的结果会简单地合并。它不会像SQL的

UNION ALL

那样去重,但对于节点集来说,通常每个节点都是唯一的,所以去重不是主要考虑。性能上,虽然理论上会执行多个表达式,但在大多数现代XPath引擎中,这种开销通常可以忽略不计,尤其是在处理合理大小的文档时。

除了直接选择,XPath还有哪些高级技巧可以帮助批量定位元素?

当简单的标签名、属性或联合选择不足以满足需求时,我们就需要深入挖掘XPath的“高级武器”了。这些技巧往往涉及到轴(Axes)、函数(Functions)以及对上下文(Context)的巧妙利用。它们能让你在复杂的、非结构化的或嵌套很深的文档中,像侦探一样精准地找出目标。

  1. 利用轴(Axes)进行关系定位: XPath的轴允许你根据节点之间的关系来选择节点,而不仅仅是它们的层级。这对于批量选择那些没有独特属性,但与某个已知节点有特定关系的元素非常有用。

    • following-sibling::*
      :选择当前节点之后的所有同级元素。
    • preceding-sibling::*
      :选择当前节点之前的所有同级元素。
    • descendant::*
      :选择当前节点的所有后代元素。
    • ancestor::*
      :选择当前节点的所有祖先元素。
    • parent::*
      :选择当前节点的直接父元素。
    • child::*
      :选择当前节点的直接子元素(这是默认轴,通常省略)。

    举个例子,如果你找到一个

    div
    ,它的标题是
    <h2>产品列表</h2>
    ,然后你想抓取这个
    div
    后面所有
    ul
    里的
    li
    元素:
    //h2[text()='产品列表']/following-sibling::ul/li

    这个表达式首先定位到文本为“产品列表”的

    h2
    标签,然后从它的所有同级兄弟元素中找到
    ul
    标签,再从这些
    ul
    标签中选择所有的
    li
    子元素。这种“先找到参照物,再定位目标”的思路,在

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

html node 排列 a标签 yy

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4643

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

951

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1229

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6641

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3383

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6620

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9121

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1230

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1072

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 228人学习