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

如何用XPath精准定位两个指定<tr A>间的<tr B>元素?

解决XPath精准定位区段内元素的问题

嘿,我来帮你搞定这个定位难题!你的核心需求是精准抓取第一个<tr A>(title="123")之后、第二个<tr A>(title="456")之前的所有<tr B>,而原来的XPath之所以会返回6个元素,是因为它只判断了<tr B>前面存在<tr A>,但没限定是哪一组<tr A>之间的元素。

问题根源

你原来的表达式:

//*[@title='123']/../following-sibling::tr[@B][preceding-sibling::tr[@A]]

这里的preceding-sibling::tr[@A]只要<tr B>前面有任意一个<tr A>就会匹配,所以后面区段(title="456"之后)的<tr B>也会被选中——因为它们前面确实有<tr A>(包括123和456的那两个)。

两种精准定位的解决方案

方案1:通过计数前置<tr A>的数量

我们可以限定<tr B>前面只有1个<tr A>(也就是title="123"的那个),这样就能排除后面区段的元素(它们前面会有2个及以上的<tr A>):

//tr[@A][td/@title='123']/following-sibling::tr[@B][count(preceding-sibling::tr[@A])=1]
  • 先精准定位到title="123"的<tr A>
  • 再找它的后续兄弟<tr B>,且这些<tr B>的前置<tr A>数量恰好为1

方案2:限定<tr B>在目标<tr A>区间内

直接指定<tr B>必须在title="123"的<tr A>之后,且在title="456"的<tr A>之前:

//tr[@B][preceding-sibling::tr[@A][td/@title='123'] and following-sibling::tr[@A][td/@title='456']]
  • 匹配所有<tr B>
  • 要求它前面有title="123"的<tr A>,同时后面有title="456"的<tr A>

这两种写法都能精准抓取你需要的第一个区段内的所有<tr B>,不管数量是4个还是150个都适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:32:35