几个不同的关键XPath概念......
绝对vs相对XPath(/
vs .
)
-
/
引入绝对位置路径,从文档的根开始。 -
.
从上下文节点开始引入相对位置路径。
命名元素vs任何元素(ename
vs *
)
-
/ename
选择一个ename
根元素 -
./ename
选择ename
当前节点的所有子元素。 -
/*
选择根元素,无论名称如何。 -
./*
或者*
选择上下文节点的所有子元素,而不管名称。
后代或自我轴(//*
)
-
//ename
选择ename
文档中的所有元素。 -
.//ename
选择ename
上下文节点或其下的所有元素。 -
//*
选择文档中的所有元素,无论名称如何。 -
.//*
选择上下文节点处或下方的所有元素,无论名称如何。
考虑到这些概念,以下是您具体问题的答案......
-
.//*[@id='Passwd']
表示选择当前上下文节点或其下具有id
属性值等于的 所有元素'Passwd'
。 -
//child::input[@type='password']
可以简化为,//input[@type='password']
并且意味着选择input
文档中type
属性值等于的所有元素'password'
。
/AAA/BBB/following-sibling::* 取/AAA/BBB节点的之后的所有同级节点
总共有八个轴关键字,parent,child,ancestor祖先,descendant后裔,following,following-sibling兄弟姐妹,preceding,preceding-sibling。具体含义如下:
-
parent::div 上层父节点,你那叫div的亲生爸爸,最多有一个;
-
child::div 下层所有子节点,你的所有亲儿子中叫div的;
-
ancestor::div 上面所有直系节点,是你亲生爸爸或者你亲爹或者你亲爹的爸爸中叫div的;
-
descendant::div 下面所有节点,你的后代中叫div的,不包括你弟弟的后代;
-
following::div 自你以下页面中所有节点叫div的;
-
following-sibling::div 同层下节点,你所有的亲弟弟中叫div的;
-
preceding::div 同层上节点,你所有的亲哥哥以及他们的后代中叫div的;
-
preceding-sibling::div 同层上节点,你所有的亲哥哥中叫div的;
假设有这么一段html:
<div class="post-content">
<h1>Title</h1>
<p>Subtitle</p>
<img src="a.jpg">
<div>
<a href="example.html">Goto</a>
</div>
Bare text
<br>
<!-- this is html comment -->
<p>Bottom</p>
</div>
1 child::*
节点的所有子元素,如//div[@class="post-content"]/*
,结果:
<h1>Title</h1>
<p>Subtitle</p>
<img src="a.jpg">
<div>
<a href="example.html">Goto</a>
</div>
<br>
<p>Bottom</p>
可以看到,这里只选择了有标签名的节点,不在标签内的Bare text
和注释都被过滤了。
2 child::text()
节点的所有文本,如//div[@class="post-content"]/text()
,结果:
Bare text
3 child::node()
节点下的所有内容,不论是标签还是文本还是其他,//div[@class="post-content"]/node()
,结果:
<h1>Title</h1>
<p>Subtitle</p>
<img src="a.jpg">
<div>
<a href="example.html">Goto</a>
</div>
Bare text
<br>
<!-- this is html comment -->
<p>Bottom</p>
原样输出了其下的所有内容。
参考:
http://www.imooc.com/wenda/detail/579577
https://www.cnblogs.com/zhaozhan/archive/2009/09/10/1564332.html
https://blog.csdn.net/hb5cn/article/details/84937449