XPath如何选择兄弟节点?

月夜之吻
发布: 2025-09-03 08:15:01
原创
224人浏览过
使用following-sibling::和preceding-sibling::轴可选择当前节点的前后兄弟节点,结合谓词可按标签名、属性、位置等条件精确筛选,通过|操作符联合两个轴可获取所有兄弟节点。

xpath如何选择兄弟节点?

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

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

following-sibling::
登录后复制
preceding-sibling::
登录后复制
这两个轴。

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

<div class="container">
  <p>这是第一个段落。</p>
  <h2 id="current-node">当前标题</h2>
  <span>这是一个span。</span>
  <p class="intro">这是介绍段落。</p>
  <ul>
    <li>列表项1</li>
  </ul>
</div>
登录后复制

如果我们当前定位在

<h2 id="current-node">
登录后复制
这个元素,想要选择它的兄弟节点:

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

    ./following-sibling::*
    登录后复制
    这会选中
    <span>
    登录后复制
    <p class="intro">
    登录后复制
    以及
    <ul>
    登录后复制
    。这里的
    *
    登录后复制
    是一个通配符,表示任何元素类型。

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

    ./preceding-sibling::*
    登录后复制
    这会选中
    <p>这是第一个段落。</p>
    登录后复制

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

    p
    登录后复制
    标签):
    ./following-sibling::p
    登录后复制
    这会选中
    <p class="intro">这是介绍段落。

    登录后复制

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

    p
    登录后复制
    标签):
    ./preceding-sibling::p
    登录后复制
    这会选中
    <p>这是第一个段落。</p>
    登录后复制

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

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

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

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

    []
    登录后复制
    )大显身手的地方。

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

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

    <ul>
  • 按位置筛选:

    ./following-sibling::*[2]
    登录后复制
    从当前节点(假设是
    h2
    登录后复制
    )开始,选择其后第二个兄弟节点。在上面的例子中,这将是
    <p class="intro">
    登录后复制
    ./preceding-sibling::*[1]
    登录后复制
    选择其前第一个兄弟节点,即
    <p>这是第一个段落。</p>
    登录后复制

  • 按标签名和位置筛选:

    ./following-sibling::p[1]
    登录后复制
    选择其后第一个
    p
    登录后复制
    标签的兄弟节点。这会选中
    <p class="intro">
    登录后复制

  • 按属性值筛选:

    ./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
    登录后复制
    标签的兄弟节点,这在清理或定位内容时非常有用。

    Upscale
    Upscale

    AI图片放大工具

    Upscale <span>85
    <span>查看详情 Upscale

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

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

    |
    登录后复制
    就派上用场了。

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

    ./preceding-sibling::* | ./following-sibling::*
    登录后复制

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

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

    <h2 id="current-node">
    登录后复制
    ,那么上述表达式会返回:

    1. <p>这是第一个段落。</p>
      登录后复制
      (来自
      preceding-sibling::*
      登录后复制
      )
    2. <span>这是一个span。
      登录后复制
      (来自
      following-sibling::*
      登录后复制
      )
    3. <p class="intro">这是介绍段落。

      登录后复制
      (来自
      following-sibling::*
      登录后复制
      )
    4. <ul>
    5. 列表项1
    6. 登录后复制
      (来自
      following-sibling::*
      登录后复制
      )

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

    ./preceding-sibling::p | ./following-sibling::p
    登录后复制

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

    p
    登录后复制
    标签兄弟。

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

    以上就是XPath如何选择兄弟节点?的详细内容,更多请关注php中文网其它相关文章!

    相关标签:
    最佳 Windows 性能的顶级免费优化软件
    最佳 Windows 性能的顶级免费优化软件

    每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

    下载
    来源:php中文网
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    最新问题
    开源免费商场系统广告
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

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