所以我有一些看起来像这样的HTML:
<tr class="a">
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>....</td>
<td class="b">A</td>
</tr>
<tr>....</tr>
<tr class="a">
<td class="b">B</td>
<td>....</td>
</tr>
<tr>
<td class="b">Not this</td>
<td>....</td>
</tr>
我基本上想要在td
之后找到b
类tr
的第一个实例a
。问题出现在它之后可能是tr
的孩子或下一个tr
的孩子。
我可以通过以下方式获得第二个案例:
//tr[@class="a"]//td[@class="b"]
但是错过了第一种情况,因为TD是兄弟姐妹,而不是直系后代。想法?
答案 0 :(得分:2)
对于第二种情况(td
是tr
的直接后裔):
//tr[@class="a"]//td[@class="b"][1]
对于第一种情况(td
跟随tr
),这不属于第二种情况类别:
//tr[@class="a" and not(.//td[@class="b"])]/following::td[@class="b"][1]
使用union运算符(|
)将两个xpath查询组合在一起产生预期的输出:
//tr[@class="a"]//td[@class="b"][1] | //tr[@class="a" and not(.//td[@class="b"])]/following::td[@class="b"][1]
输出
Element='<td class="b">A</td>'
Element='<td class="b">B</td>'