XPath - 选择其他元素之后的第一个元素

JHo*_*nti 44 xpath

我是XPath的新手,现在已经花了几个小时摆弄它,所以我不能完全确定你是否能用它来做类似下面的事情.

好的,这是场景:我想从页面中找到一个链接.该链接只能通过它的文本值识别,即.<a>标签之间的文字(<a href="#">此链接<a>).到目前为止,我已经成功地将元素与该文本链接起来,唯一的问题是有一些人在说谎.

这些链接是从无序列表中找到的,这些列表前面是另一个链接标记,它可以作为一个非常好的"锚点"来开始搜索我想要找到的最终元素(即,然后我可以接受第一个匹配)

为了澄清一些事情,这是一个正在发生的事情的例子:

<a href="#">first dropdown menu</a>
<ul>
  <li><a href="#">some link</a></li>
  <li><a href="#">link i want to find</a></li>
</ul>

<-- *And i would actually want to find the thing from this list* --> 
<a href="#">second dropdown menu</a>
<ul>
  <li><a href="#">some link</a></li>
  <li><a href="#">link i want to find</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我应该指出,我只想接收一个结果或一组结果,第一个元素是"正确"元素 - 我想要找到的元素.

编辑: 这个问题已经得到了解答,但有一些评论我应该多说一点,以便人们可以真正理解这个问题;)

因此,我们的想法是使用一个元素来指定另一个元素的位置,该元素可能会在文档周围散布重复的搜索结果.

基本上,如果您想从一组具有相同名称或值的元素的下拉菜单中找到给定的链接,您会遇到类似这样的事情.

基本上就是这样.我知道这一点仍然有点困难,但遗憾的是我很难解释它.我相信其他人可以做得更好,如果发生这种情况,我很乐意在这里加入这个描述.

Chr*_*lls 70

我不得不读几遍你的问题,但我想我明白了.你感兴趣的是谓词.谓词允许您根据条件选择节点.

例如,您可以这样做:

//a[text()='second dropdown menu']/following::ul[1]/li/a[text()='link i want to find']
Run Code Online (Sandbox Code Playgroud)

这将选择任何带有特定文本的锚点,找到下一个ul,然后继续它的子节点.

此外,您可以在结果集中指定位置索引,以下XPath是演示(但它不能解决您的问题):

//a[text()='first dropdown menu']/ul/li[last()]/a/text()
Run Code Online (Sandbox Code Playgroud)

或者您可以使用轴来浏览兄弟姐妹/祖先/孩子:

//a[ancestor::ul/preceding::a[1]/text() = 'second dropdown menu']/text()
Run Code Online (Sandbox Code Playgroud)

所以我不确定我是否完全理解你的问题,但这应该可以帮助你编写XPath.

基本上,我假设您的XPath匹配多个列表中的锚点,并且您希望确保选择正确的.在XPath中的某个时刻,您需要一个谓词来指定一个条件,该条件仅适用于所需节点所在的列表.


Nik*_*iko 5

只是我理解正确:你想要"第二个下拉菜单"之后的"一些链接"节点

ul[preceding::a[text()='second dropdown menu' and position()=last()]]/li/a[text()='link i want to find']
Run Code Online (Sandbox Code Playgroud)

这应该做的伎俩(我不是100%肯定你需要检查位置()= 1,但我认为如果省略它,它将匹配所有后续的ul,因为前面的节点是"所有" - 这取决于你的xml结构的其余部分)