【问题标题】:Xpath query to find elements which contain a certain descendantXpath 查询以查找包含某个后代的元素
【发布时间】:2019-07-25 23:49:37
【问题描述】:

我正在使用 Html Agility Pack 在网页上运行 xpath 查询。我想在表格中找到包含某个有趣元素的行。在下面的示例中,我想获取第二行。

<table name="important">
<tr>
  <td>Stuff I'm NOT interested in</td>
</tr>
<tr>
  <td>Stuff I'm interested in</td>
  <td><interestingtag/></td>
  <td>More stuff I'm interested in</td>
</tr>
<tr>
  <td>Stuff I'm NOT interested in</td>
</tr>
<tr>
  <td>Stuff I'm NOT interested in</td>
</tr>
</table>

我想做这样的事情:

//table[@name='important']/tr[has a descendant named interestingtag]

除了有效的 xpath 语法。 ;-)

我想我可以找到有趣的元素本身,然后从返回的节点沿父链向上工作,但似乎应该有一种方法可以一步完成,而我只是在密集。

【问题讨论】:

    标签: xpath


    【解决方案1】:

    我知道这是一个迟到的答案,但为什么不反过来呢。查找所有&lt;interestingtag/&gt; 标签,然后选择父标签&lt;tr&gt;

    //interestingtag/ancestor::tr
    

    【讨论】:

      【解决方案2】:

      我知道这不是 OP 所要求的,但如果您想找到一个具有特定 属性 的后代的元素,您可以执行以下操作:

      //table[@name='important']/tr[.//*[@attr='value']]
      

      【讨论】:

        【解决方案3】:

        其实你需要寻找的是后代,而不是孩子:

        //table[@name='important']/tr[descendant::interestingtag]
        

        【讨论】:

        • 优秀。这很有帮助。抱歉,我不能接受两个答案!
        • 我总是觉得很有趣有多少方法可以在 XPath 中获得所需的结果。我相信 //table[@name='important']//interestingtag//ancestor::tr 应该也可以工作。
        • @Jeremy Stein:没问题,他公平公正地击败了我。 :-)
        • +1 用于使用“后代”轴。比“.//”速记更易读,恕我直言。
        • @Tomalak:你太客气了。 :-) 我发现它也更具可读性......太容易放错地方或看不到句号,恕我直言。
        【解决方案4】:

        “有一个名为interestintag 的后代”在XPath 中拼写为.//interestintag,所以您要查找的表达式是:

        //table[@name='important']/tr[.//interestingtag]
        

        【讨论】:

        • 非常有趣的解决方案
        猜你喜欢
        • 2018-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 2015-07-05
        • 1970-01-01
        相关资源
        最近更新 更多