我有这个:
<a>
<b>
<t>text</t>
</b>
</a>
<a>
<t>text</t>
</a>
所以我想选择文本而不管它在哪里。 (请注意,它可以是不仅仅是1/2级别的任何地方,例如它可以没有父母)
这可能吗?
答案 0 :(得分:24)
您正在寻找the descendant
axis:
descendant
轴包含上下文节点的后代;一个 后代是一个孩子或一个孩子 孩子等;因此是后代 axis永远不会包含属性或 命名空间节点
在您的情况下:/descendant:t
当然,正如其他人已经回答的那样,there is an abbreviated syntax for this:
//
是/descendant-or-self::node()/
的缩写。对于 例如,//para
是简称/descendant-or-self::node()/child::para
因此将选择任何para
元素 在文档中(甚至是para
元素 那是一个文档元素 自//para
以来被{{1}}选中 document element节点是一个子节点 根节点)
答案 1 :(得分:20)
您可以使用//
从当前节点中选择所有节点。因此//text()
将选择所有文本节点。
如果你想要所有t元素,你会//t
。如果您想要从某个点开始执行所有t
个元素,那么您可以/x/y//t
执行此操作。
答案 2 :(得分:7)
//t
代码,则只需<t>
答案 3 :(得分:1)
W3Schools有很多关于HTML相关的免费课程。 我强烈建议您阅读并制作示例。 http://www.w3schools.com/xsl/xpath_syntax.asp
提示:您可以使用浏览器的控制台来评估表达式。它位于开发者工具 - Chorme和Firefox的F12键下:
$x('<your expressions>');
因此,正如大家所说,您可以使用//
语法在页面中的任何位置查找元素。
例如//a
会在页面中返回所有 a
元素。
很可能你会想要一个特定的,所以,这就是你使用谓词的地方。它们包含在括号内。 以这个页面为例,这是一个xquery:
//a[text()="Simeon"]
此xpath将返回所有具有Simeon文本的a
个元素。
在许多情况下,您可能需要改进xpath以包含更多标识符,更具体。
//a[text()="Simeon" AND @href="/users/274344/simeon"]
因此,您几乎可以使用任何HTML属性,甚至CSS来识别您想要的特定节点。
但是现在,让我们把它提升一个档次。
假设您希望从 1月27日获取低于用户 mkimd 答案的a
元素。
如果你看一下这个页面结构,你必须得到a
并跳回几个级别,直到你能够达到保留发布日期的 span 。
//a[text()="mkimd" AND ../../div[@class="user-action-time"]/span[contains(.,"Jan")]]
执行这些查询的方法有很多种,我给出的最后一个示例可以使用不同的xqueries来实现。
我发现xqueries与控制台目录中的导航非常相似,如Linux BASH - 相对路径和绝对路径,标识符类似于SQL WHERE
子句。
如果您进行研究,XPATH语法中有许多可用的函数,例如
+
,-
,*
,div
,!=
,<
,<=
,{{1 },...)我强烈建议您使用像 Firefox Firefug FirePath 插件这样的工具来练习xquery并检查您是否获得了所需的元素 - 它会突出显示找到的元素。
====================
编辑 - 5月8日 - 15日
如果您在Selenium自动化中使用Xpath,请知道它不会帮助您选择CSS伪元素。