在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">这个元素,想要选择它的兄弟节点:
选择所有紧随其后的兄弟节点:
./following-sibling::*
这会选中<span>
和<p class="intro">
以及<ul>
。这里的*
是一个通配符,表示任何元素类型。选择所有在其之前的兄弟节点:
./preceding-sibling::*
这会选中<p>这是第一个段落。</p>
。选择紧随其后的特定类型的兄弟节点(例如,下一个
p
标签):./following-sibling::p
这会选中<p class="intro">这是介绍段落。</p>
。选择在其之前的特定类型的兄弟节点(例如,上一个
p
标签):./preceding-sibling::p
这会选中<p>这是第一个段落。</p>
。
这些轴是相对于当前上下文节点而言的,所以前面加上
./是一个好习惯,明确表示从当前节点开始查找。 XPath如何精确筛选特定的兄弟节点?
在实际应用中,我们很少会无差别地选择所有兄弟节点。更多时候,我们希望根据一些条件,比如标签名、属性值、甚至它们在兄弟列表中的位置,来精确地筛选出我们想要的那个或那几个兄弟。这正是谓词(
[])大显身手的地方。
想象一下,你正在爬取一个页面,发现一个
div里包含了多个
p标签,其中只有带有特定
class的
p才是你需要的。或者,你可能想找到当前元素之后的第二个
span。
按位置筛选:
./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标签的兄弟节点,这在清理或定位内容时非常有用。 XPath选择兄弟节点时,如何同时获取前后所有兄弟元素?
有时,我们不仅想知道当前元素后面的兄弟,也想知道它前面的,甚至想把它们作为一个整体来处理。这时候,XPath的“联合”(Union)操作符
|就派上用场了。

全面的AI聚合平台,一站式访问所有顶级AI模型


|操作符允许我们将两个或多个XPath表达式的结果集合并起来。所以,如果你想获取一个元素的所有兄弟节点(不包括它自己),你可以这样写:
./preceding-sibling::* | ./following-sibling::*
这会返回一个节点集,其中包含了当前节点之前的所有兄弟节点,以及之后的所有兄弟节点。这个方法非常直观,也很好理解。
举个例子,如果我们的当前节点是
<h2 id="current-node">,那么上述表达式会返回:
<p>这是第一个段落。</p>
(来自preceding-sibling::*
)<span>这是一个span。</span>
(来自following-sibling::*
)<p class="intro">这是介绍段落。</p>
(来自following-sibling::*
)<ul><li>列表项1</li></ul>
(来自following-sibling::*
)
当然,如果你只需要特定类型的兄弟,也可以在联合表达式中加入谓词:
./preceding-sibling::p | ./following-sibling::p
这会返回当前节点之前和之后的所有
p标签兄弟。
这种组合方式,在处理那些内容结构相对扁平,但又需要横向收集数据的场景下,特别方便。比如,一个表单字段的标签和输入框往往是兄弟关系,或者一个新闻标题和它的发布日期可能也是兄弟。用这种方式一次性捕获它们,可以省去很多二次筛选的麻烦。不过,需要注意,如果DOM结构非常复杂,节点集可能会很大,适当地缩小范围(比如限定标签名)总是一个好习惯,能避免不必要的性能开销,也能让你的XPath表达式更具可读性。
以上就是XPath如何选择兄弟节点?的详细内容,更多请关注知识资源分享宝库其它相关文章!
相关标签: html node ai win html union 堆 class dom ul li 大家都在看: XPath如何测试节点存在? XPath如何选择注释节点? XPath如何选择父节点? XPath如何匹配多个节点? XPath如何计算节点数?
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。