XPath:找到孩子和兄弟姐妹的第一次出现

时间:2015-06-05 02:52:48

标签: xpath scrapy

所以我有一些看起来像这样的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之后找到btr的第一个实例a。问题出现在它之后可能是tr的孩子或下一个tr的孩子。

我可以通过以下方式获得第二个案例:

//tr[@class="a"]//td[@class="b"]

但是错过了第一种情况,因为TD是兄弟姐妹,而不是直系后代。想法?

1 个答案:

答案 0 :(得分:2)

对于第二种情况(tdtr的直接后裔):

//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>'