我是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>
我应该指出,我只想接收一个结果或一组结果,第一个元素是“正确”元素 - 我想要找到的元素。
修改 这个问题已经得到了解答,但有一些评论我应该多说一点,以便人们真正理解这个问题;)
因此,我们的想法是使用一个元素来指定另一个元素的位置,该元素可能会在文档周围散布重复的搜索结果。
如果你想从一组具有相同名称或值的元素的下拉菜单中找到给定的链接,本质上你会遇到类似这样的事情。
基本上就是这样。我知道这一点仍然有点困难,但遗憾的是我很难解释它。我相信其他人可以做得更好,如果发生这种情况,我很乐意在这里加入这个描述。
答案 0 :(得分:66)
我必须多次阅读你的问题,但我想我明白了。你感兴趣的是谓词。谓词允许您根据条件选择节点。
例如,你可以这样做:
//a[text()='second dropdown menu']/following::ul[1]/li/a[text()='link i want to find']
这将选择任何带有特定文本的锚点,找到下一个ul,然后继续它的子项。
此外,您可以在结果集中指定位置索引,以下XPath是演示(但它不能解决您的问题):
//a[text()='first dropdown menu']/ul/li[last()]/a/text()
或者你可以使用轴来浏览兄弟姐妹/祖先/孩子:
//a[ancestor::ul/preceding::a[1]/text() = 'second dropdown menu']/text()
所以我不确定我是否完全理解你的问题,但这应该可以帮助你编写XPath。
基本上,我假设您的XPath与多个列表中的锚点匹配,并且您希望确保选择正确的列表。在XPath中的某个时刻,您需要一个谓词来指定一个条件,该条件仅适用于所需节点所在的列表。
答案 1 :(得分:5)
只是我理解正确:你想在“第二个下拉菜单”之后找到“某个链接”节点
ul[preceding::a[text()='second dropdown menu' and position()=last()]]/li/a[text()='link i want to find']
这应该可以解决问题(我不是100%确定你需要检查位置()= 1,但我认为如果你省略它,它将匹配所有后续的ul,因为前面是“所有”前面的节点 - 取决于你的xml结构的其余部分)
答案 2 :(得分:0)
如果我错了,请纠正我 - 你需要从上面的例子中选择“第二个下拉菜单”,但是文本可以复制,所以你只需要第二个。 的XPath:
//a[text()='second drop down menu'][2]