使用Xpath获取href标签中文本匹配的第二个URL

4

一个HTML页面有分页链接,一个在页面顶部,另一个在底部。

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

由于顶部的一些链接存在问题,因此我想使用XPath引用底部的链接。

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

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

我需要使用AnchorText引用该链接,例如像这样的链接:

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

href中含有随机文本,是一个javascript函数,因此我不知道它会是什么。

使用xpath可以实现吗?

2个回答

10

选择文档中第二个 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子元素。


4
很简单:
 (//a)[2]

//a[2]选择页面上的所有锚点,[2]选择第二个(从1开始计数,不是从0开始,因此2实际上是第二个,而不是像数组一样是第三个)

如果您想获取文本为33的链接,则可以使用:

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

请参考完整的xpath定义,访问http://www.w3.org/TR/xpath/
编辑:
针对Alexandre的评论,您可以使用:
 (//a[./text() = "33"])[2]

这将首先选择所有文本为33的<a>标签,然后选择其中第二个。
编辑2

注意:位置路径//para[1]与位置路径/descendant::para[1]不是相同的。后者选择第一个后代para元素;前者选择所有后代para元素,它们都是其父级的第一个para子元素。

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

也许我们想要具有给定文本的第二个链接,但问题并不太清楚。 - Alex Jasmin
谢谢,我实际上只返回了数组,然后如果它有两个元素,就取第二个。 这样更安全一些,但还是感谢您的提示! - Blankman
应该使用(//a)[2]。表达式//a[2]将选择任何父节点的第二个a子元素,而不是整个文档中的第二个a元素。 - markusk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接