【问题标题】:Xpath to get the 2nd url with the matching text in the href tagXpath 获取第二个 url 与 href 标记中的匹配文本
【发布时间】:2010-04-12 00:31:20
【问题描述】:

一个html页面有分页链接,1个设置在页面顶部,另一个设置在页面底部。

使用 HtmlUnit,我目前正在使用 getByAnchorText("1"); 获取页面上的 HtmlAnchor

顶部的一些链接有问题,所以我想使用XPath引用底部的链接。

nextPageAnchor = (HtmlAnchor) page.getByXPath("");

如何使用 xpath 引用页面上的第二个链接?

我需要使用 AnchorText 引用链接,所以链接如下:

<a href="....">33</a>

href 有随机文本,并且是一个 javascript 函数,所以我不知道它会是什么。

这可以通过 xpath 实现吗?

【问题讨论】:

    标签: java xpath htmlunit


    【解决方案1】:

    要选择文档中任意位置的第二个a 元素:

    (//a)[2]
    

    href 属性中选择第二个带有特定文本的a 元素:

    (//a[@href='...'])[2]
    

    请注意,括号是必需的,并且表达式//a[2] 不会按照您的意图执行:它将选择所有a 元素,即任何父元素的第二个a 元素。如果您的输入是

    <p>Link <a href="one.html">One</a></p>
    <p>Link <a href="two.html">Two</a> and <a href="three.html">Three</a>.</p>
    <p>Link <a href="four.html">Four</a> and <a href="five.html">Five</a>.</p>
    

    (//a)[2] 将返回第二个链接(two.html),而//a[2] 将返回第三个和第五个链接(three.html 和 Five.html),因为它们都是它们的第二个 a 子父母。

    【讨论】:

      【解决方案2】:

      很简单:

       (//a)[2]
      

      //a 获取页面上的所有锚点,[2] 获取第二个锚点(它是一个索引而不是零索引,所以 2 实际上是第二个,而不是您对数组所期望的第三个,例如)

      如果您想获得带有33 文本的链接,那么您可以使用:

       //a[./text() = "33"]
      

      有关完整的 xpath 定义,请参阅 http://www.w3.org/TR/xpath/

      编辑

      要解决 Alexandre 的评论,您可以使用

       (//a[./text() = "33"])[2]
      

      这将首先选择文本为 33 的所有 &lt;a&gt; 标签,然后选择其中的第二个。

      编辑 2

      注意:位置路径 //para[1] 与位置路径 /descendant::para[1] 的含义不同。后者选择第一个后代 para 元素;前者选择作为其父母的第一个 para 孩子的所有后代 para 元素。

      Markusk 确实是正确的。上面的引用来自上面引用的 xPath 定义。

      【讨论】:

      • 也许我们想要 第二个链接给定的文本 但问题不是太清楚
      • 谢谢,我实际上只是返回了数组,然后如果它有 2 个元素,则得到第二个。那样会更安全一些,但感谢您的提示!
      • (//a)[2] 应改为使用。表达式//a[2] 将选择任何父节点的第二个a 子节点,而不是整个文档中的第二个a 元素。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多