Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 如何找到包含此文本的页面上的第一个链接?_Xpath - Fatal编程技术网

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

Xpath 如何找到包含此文本的页面上的第一个链接?,xpath,Xpath,如果我有两个链接: <div class="abc"> <a id="def1" href="/definitely">Definitely 1</a> <a id="def2" href="/definitely">Definitely 2</a> </div> 但似乎没有 我做错了什么?您的XPath表达式选择了第一个元素,该元素的每个div的href都是正确的,并且每个div的类都包含一个元素。因此,

如果我有两个链接:

<div class="abc">
  <a id="def1" href="/definitely">Definitely 1</a>
  <a id="def2" href="/definitely">Definitely 2</a>    
</div>
但似乎没有


我做错了什么?

您的XPath表达式选择了第一个元素,该元素的每个div的href都是正确的,并且每个div的类都包含一个元素。因此,如果有两个匹配的div,每个div都有多个匹配的a元素,那么就会得到一个包含两个元素的结果集——第一个div中的第一个a,第二个div中的第一个a

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

(//div[@class='abc']//a[contains(@href,'def')])[1]
除此之外,经过测试,您的表达式对我来说效果很好。

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

不选择//someName的第一个元素

看一看,人们会意识到事实上

相当于:

这将选择每个someName元素,它是其父节点的第一个someName子元素

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

解决方案:

而不是

//someName[1]
使用:

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


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

刚刚测试过。你的表达很有效。用什么语言?如果您使用的是.NET,那么问题可能是XML文档和XPath处理器中的名称空间配置不正确。另外,您确定使用的是格式良好的XML吗?好问题,+1。请参阅我的答案以了解解释和解决方案:它不是零基索引?
//someName[1]
//someName[1]
/descendant-or-self::node()/someName[1]
//someName[1]
(//someName)[1]
(//div[@class='abc']//a[contains(@href,'def')]) [1]