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

