如何在包含此文本的页面上找到第一个链接?

时间:2010-12-26 16:47:55

标签: xpath

如果我有两个链接:

<div class="abc">
  <a id="def1" href="/definitely">Definitely 1</a>
  <a id="def2" href="/definitely">Definitely 2</a>    
</div>

我想确定第一个(def1),我认为这样可行:

var linkXPath = "//div[@class='abc']//a[contains(@href,'def')][1]";

但它似乎没有。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

这是一个常见问题解答为什么

//someName[1]

未选择//someName的第一个元素。

查看 the definition of the // abbreviation 实际上会意识到

//someName[1]

相当于

/descendant-or-self::node()/someName[1]

并选择每个someName元素作为其父节点的第一个someName子元素。

因此,如果有两个或多个someName元素是其父级的第一个someName子元素,则会选中所有这些元素。

<强>解决方案

而不是

//someName[1]

使用

(//someName)[1]

因此,在您的特定情况下使用

(//div[@class='abc']//a[contains(@href,'def')]) [1]

除此之外,如果在实际的XML文档中指定了默认命名空间,则上述表达式都不会选择任何节点。选择具有默认命名空间的文档中的节点是最大的XPath常见问题解答。要找到解决方案,只需在此SO标记中以及Internet上的任何位置搜索“默认命名空间”。

答案 1 :(得分:2)

您的XPath表达式选择每个 a(具有正确的类)的第一个div元素(右侧href)包含一个元素。因此,如果有两个匹配的div个,每个匹配有多个a个元素,则会得到一个包含两个元素的reault集 - 第一个a 1}},以及第二个div中的第一个a

要仅选择整个结果集的第一个元素,请使用括号,如下所示:

div

除此之外,你的表达对我来说很好(测试here)。