You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XPath精准选取每个h2标签前后的p和li标签?

按分组获取每个H2对应的后续P和LI标签的XPath写法

问题背景

给定HTML结构:

<div class="reviewText" id="game-review">
    <h2>xWays Hoarder xSplit Review</h2>
    <p>...</p>
    <h2 id="xways-hoarder-xsplit-features">xWays Hoarder xSplit Features</h2>
    <p>...</p>
    <ul><li>...</li></ul>
    <h2 id="the-200-spins-xways-hoarder-xsplit-experience">...</h2>
    <p>...</p>
</div>

需求是按每个h2分组,获取每个h2之后、下一个h2之前的所有p和li标签,原XPath仅能返回所有h2之间的p标签,无法实现分组。


解决方案

1. XPath 1.0 兼容写法(通用场景)

要为每个h2单独匹配对应的p和li,可以使用以下表达式:

//div[@id='game-review']/h2/following-sibling::*[self::p or self::li][generate-id(preceding-sibling::h2[1]) = generate-id(current())]

表达式说明:

  • //div[@id='game-review']/h2:定位到目标容器下的所有h2标签
  • following-sibling::*[self::p or self::li]:筛选h2的后续兄弟节点中,类型为p或li的节点
  • generate-id(preceding-sibling::h2[1]) = generate-id(current()):确保这些p/li节点的最近前置h2就是当前遍历的h2,从而实现分组匹配

2. 针对单个h2的精准匹配

如果需要匹配某一个特定h2对应的内容(比如第一个h2),可以直接指定位置:

//div[@id='game-review']/h2[1]/following-sibling::*[self::p or self::li][count(preceding-sibling::h2) = 1]

将[1]替换为2、3即可匹配第二个、第三个h2对应的内容。

3. XPath 2.0+ 简化写法(支持现代解析器)

如果使用支持XPath 2.0及以上的工具,可以用更简洁的表达式:

//div[@id='game-review']/h2 ! following-sibling::*[self::p or self::li][. << following-sibling::h2[1]]

!是XPath 2.0的映射运算符,会为每个h2执行后面的表达式;<<用于判断节点顺序,确保当前p/li在当前h2的下一个h2之前。


内容的提问来源于stack exchange,提问作者guhbuzchc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:36:38