XPath查找元素的祖父节点

3

我在使用Xpath获取祖父元素方面遇到了些困难。不幸的是,我的尝试都没有成功。

HTML

<span class="fsm fwn fcg">
  <a href="bla bla">
    <abbr>
      <span class="timestampContent" id="js_19">21 mins</span>
    </abbr>
  </a>
</span>

我需要获取 `<a href="bla bla">` 元素作为 `<span class="timestampContent" id="js_19">21 mins</span>` 的祖先元素。
我尝试了以下代码: //span[@class='timestampContent' and contains(text(), 21 mins)]../.. 或者 ../..//span[@class='timestampContent' and contains(text(), 21 mins)] 还有其他一些选项,但是没有达到我的预期效果。
4个回答

10

你的第一次尝试已经接近成功,只是在 .. 前面少了一个 / (同时 '21 分钟' 也缺少引号,我相信那只是一个打字错误):

//span[@class='timestampContent' and contains(text(), '21 mins')]/../..

或者,您可以选择另一种方式,即选择具有特定标准的span后代元素:


//*[*/span[@class='timestampContent' and contains(text(), '21 mins')]]

2
你可以尝试: //span[@class='timestampContent' and contains(text(), '21 分钟')]/../parent::a 这是一种更直接的方式,可以找到你需要的 a 元素,因此你不需要像使用 ancestor 一样添加 [1][@href='bla bla']
当直接指定特定的 div 元素时,这可能会很有帮助,而无需指定其属性。

2

您需要将文本用引号括起来,并且/必须位于]..之间:

//span[@class='timestampContent' and contains(text(), '21 mins')]/../..

然而,如果标记在将来发生更改,也许更可靠的方法是不显式地向上两级,而是找到第一个祖先 a 标签:

//span[@class='timestampContent' and contains(text(), '21 mins')]/ancestor::a[1]

2
//span[@class='timestampContent' and contains(text(),'21 mins')]/ancestor::a[@href='bla bla']

在这里,“and”条件使元素更加具体化。您正在寻找具有特定 href('bla bla') 的元素。如果您想要查找特定的元素,它是特定子元素的父级,则使用ancestor::命令。


2
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - adiga
请编辑答案并在其中添加解释,而不是在评论中添加 :) - adiga

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