如何用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
相关产品推荐
相关产品推荐

