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在处理XML或HTML文档时,其核心能力之一就是能够轻松地匹配和返回多个节点。它并不是一个“是否能”的问题,而更多是“如何更精确、更高效地”选择你所需的一组节点。无论是寻找页面上所有链接、所有特定类型的段落,还是那些满足复杂条件的数据项,XPath都提供了丰富的语法和操作符来达成这个目标。
要匹配多个节点,XPath提供了多种策略,具体选择哪种取决于你的目标和文档结构。最直接的方式是选择所有同名元素,比如
//a
<a>
<li>
//ul/li[position() <= 3]
//div[@class='product-item']
product-item
div
//*
//div/*
div
|
|
//h1 | //h2 | //h3
//p[contains(text(), '关键词')]
这些只是冰山一角,XPath的强大之处在于其组合能力,通过将这些基本选择器与谓词、轴(axes)结合,几乎可以定位任何你想要的节点集合。
这个需求在实际工作中太常见了,简直是XPath的“基本功”之一。我们经常会遇到这样的场景:页面上有很多
div
class
product-card
href
category
要精确选择,关键在于使用谓词(Predicates)。谓词用方括号
[]
最直接的是完全匹配属性值:
//div[@class='product-card']
这会返回文档中所有
class
product-card
div
div
class
<div class="product-card featured">
contains()
使用 contains()
//div[contains(@class, 'product-card')]
这样就能匹配到所有
class
product-card
div
product-card featured
featured product-card
类似的,还有
starts-with()
ends-with()
//a[starts-with(@href, '/products/')] // 匹配所有href以/products/开头的链接
当然,我们还可以组合多个条件,使用
and
or
//a[@target='_blank' and contains(@href, 'external')] // 匹配所有在新窗口打开且链接包含'external'的a标签 //input[@type='text' or @type='email'] // 匹配所有type是text或email的input标签
通过这些组合,你可以构建出非常精细的筛选逻辑,从一大堆节点中精准地“捞”出你真正需要的那一部分。这就像在图书馆里,你不只是找“书”,而是找“作者是XX,出版年份在YY之后,并且书名包含ZZ关键词”的书。
有时候,我们的需求不是“所有
div
p
|
想象一下,你正在解析一个新闻页面,想抓取所有标题(可能是
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()
|
需要注意的是,
|
UNION ALL
当简单的标签名、属性或联合选择不足以满足需求时,我们就需要深入挖掘XPath的“高级武器”了。这些技巧往往涉及到轴(Axes)、函数(Functions)以及对上下文(Context)的巧妙利用。它们能让你在复杂的、非结构化的或嵌套很深的文档中,像侦探一样精准地找出目标。
利用轴(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
以上就是XPath如何匹配多个节点?的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号