【问题标题】:XPath: Find first occurance in children and siblingsXPath:在孩子和兄弟姐妹中查找第一次出现
【发布时间】:2015-06-05 02:52:47
【问题描述】:

所以我有一些看起来像这样的 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>

我基本上想在tra 类之后找到tdb 的第一个实例。出现的问题是它可能在tr 的一个孩子中或在它之后的下一个tr 中。

我可以得到第二种情况:

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

但这忽略了第一种情况,因为 TD 在兄弟姐妹中,而不是直系后代中。想法?

【问题讨论】:

    标签: xpath scrapy


    【解决方案1】:

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

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

    对于第一种情况(td 紧随tr),不属于第二种情况:

    //tr[@class="a" and not(.//td[@class="b"])]/following::td[@class="b"][1]
    

    使用联合运算符 (|) 将两个 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>'
    

    【讨论】:

    • 谢谢,这似乎工作得很好。仍在学习 XPath,还不确定所有方面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多