0

0

XPath如何选择兄弟节点?

月夜之吻

月夜之吻

发布时间:2025-09-03 08:15:01

|

224人浏览过

|

来源于php中文网

原创

使用following-sibling::和preceding-sibling::轴可选择当前节点的前后兄弟节点,结合谓词可按标签名、属性、位置等条件精确筛选,通过|操作符联合两个轴可获取所有兄弟节点。

xpath如何选择兄弟节点?

在XPath的世界里,选择兄弟节点是日常操作,核心思路就是利用XPath提供的“轴”(axes)来定位。简单来说,你需要从当前节点出发,告诉XPath你是想找它前面的兄弟,还是后面的兄弟,或者干脆是所有兄弟。

要选择兄弟节点,我们主要依赖

following-sibling::
preceding-sibling::
这两个轴。

假设我们有这样的HTML结构:

这是第一个段落。

当前标题

这是一个span。

这是介绍段落。

  • 列表项1

如果我们当前定位在

这个元素,想要选择它的兄弟节点:

  • 选择所有紧随其后的兄弟节点:

    ./following-sibling::*
    这会选中

    以及
      。这里的
      *
      是一个通配符,表示任何元素类型。

    • 选择所有在其之前的兄弟节点:

      ./preceding-sibling::*
      这会选中

      这是第一个段落。

    • 选择紧随其后的特定类型的兄弟节点(例如,下一个

      p
      标签):
      ./following-sibling::p
      这会选中

      这是介绍段落。

    • 选择在其之前的特定类型的兄弟节点(例如,上一个

      p
      标签):
      ./preceding-sibling::p
      这会选中

      这是第一个段落。

    这些轴是相对于当前上下文节点而言的,所以前面加上

    ./
    是一个好习惯,明确表示从当前节点开始查找。

    XPath如何精确筛选特定的兄弟节点?

    在实际应用中,我们很少会无差别地选择所有兄弟节点。更多时候,我们希望根据一些条件,比如标签名、属性值、甚至它们在兄弟列表中的位置,来精确地筛选出我们想要的那个或那几个兄弟。这正是谓词(

    []
    )大显身手的地方。

    想象一下,你正在爬取一个页面,发现一个

    div
    里包含了多个
    p
    标签,其中只有带有特定
    class
    p
    才是你需要的。或者,你可能想找到当前元素之后的第二个
    span

    • 按位置筛选:

      ./following-sibling::*[2]
      从当前节点(假设是
      h2
      )开始,选择其后第二个兄弟节点。在上面的例子中,这将是

      ./preceding-sibling::*[1]
      选择其前第一个兄弟节点,即

      这是第一个段落。

    • 按标签名和位置筛选:

      ./following-sibling::p[1]
      选择其后第一个
      p
      标签的兄弟节点。这会选中

    • 按属性值筛选:

      ./following-sibling::p[@class='intro']
      选择其后所有
      p
      标签的兄弟节点中,
      class
      属性值为
      intro
      的那个。

    • 结合多个条件筛选:

      ./following-sibling::*[self::p and @class='important']
      这会选择所有紧随其后的兄弟节点中,既是
      p
      标签,
      class
      属性又是
      important
      的元素。这里的
      self::p
      是确保节点类型是
      p
      的一个显式写法,尽管在
      following-sibling::p
      中已经隐含了。

    这些谓词可以非常灵活地组合,帮助我们从一堆兄弟元素中精准地捞出目标。我个人觉得,掌握了谓词,XPath的选择能力才算真正发挥出来。有时候,你会发现需要一些复杂的逻辑,比如

    ./following-sibling::*[not(self::script) and not(self::style)][1]
    ,这表示选择其后第一个非
    script
    也非
    style
    标签的兄弟节点,这在清理或定位内容时非常有用。

    Clippah
    Clippah

    AI驱动的创意视频处理平台

    下载

    XPath选择兄弟节点时,如何同时获取前后所有兄弟元素?

    有时,我们不仅想知道当前元素后面的兄弟,也想知道它前面的,甚至想把它们作为一个整体来处理。这时候,XPath的“联合”(Union)操作符

    |
    就派上用场了。

    |
    操作符允许我们将两个或多个XPath表达式的结果集合并起来。所以,如果你想获取一个元素的所有兄弟节点(不包括它自己),你可以这样写:

    ./preceding-sibling::* | ./following-sibling::*

    这会返回一个节点集,其中包含了当前节点之前的所有兄弟节点,以及之后的所有兄弟节点。这个方法非常直观,也很好理解。

    举个例子,如果我们的当前节点是

    ,那么上述表达式会返回:

    1. 这是第一个段落。

      (来自
      preceding-sibling::*
      )
    2. 这是一个span。
      (来自
      following-sibling::*
      )
    3. 这是介绍段落。

      (来自
      following-sibling::*
      )
      • 列表项1
      (来自
      following-sibling::*
      )

    当然,如果你只需要特定类型的兄弟,也可以在联合表达式中加入谓词:

    ./preceding-sibling::p | ./following-sibling::p

    这会返回当前节点之前和之后的所有

    p
    标签兄弟。

    这种组合方式,在处理那些内容结构相对扁平,但又需要横向收集数据的场景下,特别方便。比如,一个表单字段的标签和输入框往往是兄弟关系,或者一个新闻标题和它的发布日期可能也是兄弟。用这种方式一次性捕获它们,可以省去很多二次筛选的麻烦。不过,需要注意,如果DOM结构非常复杂,节点集可能会很大,适当地缩小范围(比如限定标签名)总是一个好习惯,能避免不必要的性能开销,也能让你的XPath表达式更具可读性。

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    c语言union的用法
    c语言union的用法

    c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

    126

    2023.09.27

    堆和栈的区别
    堆和栈的区别

    堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

    399

    2023.07.18

    堆和栈区别
    堆和栈区别

    堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

    575

    2023.08.10

    class在c语言中的意思
    class在c语言中的意思

    在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

    469

    2024.01.03

    python中class的含义
    python中class的含义

    本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

    17

    2025.12.06

    DOM是什么意思
    DOM是什么意思

    dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

    3420

    2024.08.14

    DOM是什么意思
    DOM是什么意思

    dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

    3420

    2024.08.14

    li是什么元素
    li是什么元素

    li是HTML标记语言中的一个元素,用于创建列表。li代表列表项,它是ul或ol的子元素,li标签的作用是定义列表中的每个项目。本专题为大家li元素相关的各种文章、以及下载和课程。

    419

    2023.08.03

    go语言 注释编码
    go语言 注释编码

    本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

    30

    2026.01.31

    热门下载

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

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    XPath 参考手册
    XPath 参考手册

    共0课时 | 0人学习

    XPath 教程
    XPath 教程

    共9课时 | 4.1万人学习

    Swoft2.x速学之http api篇课程
    Swoft2.x速学之http api篇课程

    共16课时 | 0.9万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号