前言
XPath是一门在XML文档查找元素信息的语言,在这里我们将学习XPath的基本用法。
选取节点常用的语法表达式
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取(取子节点)。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
- 注意
- 只要/后面不是非节点名称比如
//li/@class
(代表li节点的class属性)或者//li/..
(li节点的父节点)那么就不使用路径匹配 - 假如/后面是节点名称,那么就使用路径匹配,比如
//li/p
(匹配li节点下的p节点) - 也可以混合使用比如可以这样
//li/..
(匹配li节点的父节点);或者可以这样//li/../li[2]
(匹配li节点的父节点的第2个li节点,也就是li的兄弟节点);还可以这样//li/.
(匹配li节点的当前节点,也就是我匹配我自己,等同于//li
)
- 只要/后面不是非节点名称比如
XPath内建函数
Xpath 提供 100 多个内建函数,这些函数给我们提供了很多便利,比如实现文本匹配、模糊匹配、以及位置匹配等,下面介绍几个常用的内建函数。
函数名称 | xpath表达式示例 | 示例说明 |
---|---|---|
text() | //p[1]/text() | 文本匹配,表示值取第一个p节点中的文本内容 |
contains() | //*[contains(@class,"colo")] | 模糊匹配,表示选择 class中包含“colo”的所有 节点。 |
last() | //*[@class='web'][last()] | 位置匹配,表示选择@class='web’的最后一个节点。 |
position() | //*[@class='site'][position()<=2] | 位置匹配,表示选择@class='site’的前两个节点。 |
实例
<ul class="BookList">
<li class="book1" id="book_01" href="http://www.testwenxi.net/">
<p class="name">c语言小白变怪兽</p>
<p class="model">纸质书</p>
<p class="price">80元</p>
<p class="color">红蓝色封装</p>
</li>
<li class="book2" id="book_02" href="http://www.testwenxi.net/">
<p class="name">Python入门到精通</p>
<p class="model">电子书</p>
<p class="price">45元</p>
<p class="color">蓝绿色封装</p>
</li>
</ul>
-
表达式:
//li
解释:在所有节点查找为li的节点
结果如下:<li class="book1" id="book_01" href="http://www.testwenxi.net/"> <p class="name">c语言小白变怪兽</p> <p class="model">纸质书</p> <p class="price">80元</p> <p class="color">红蓝色封装</p> </li> <li class="book2" id="book_02" href="http://www.testwenxi.net/"> <p class="name">Python入门到精通</p> <p class="model">电子书</p> <p class="price">45元</p> <p class="color">蓝绿色封装</p> </li>
-
表达式:
//li[1]/p
解释:在所有节点查找第一个li节点下的p节点
结果如下:<p class="name">c语言小白变怪兽</p> <p class="model">纸质书</p> <p class="price">80元</p> <p class="color">红蓝色封装</p>
-
表达式:
//@class
解释:在所有节点查找包含class属性的节点
结果如下:class="BookList" class="book1" class="name" class="model" class="price" class="color" class="book2" class="name" class="model" class="price" class="color"
-
表达式:
//li[1]/@class
解释:在所有节点查找第一个li节点的class属性
注意:这里很多小伙伴会以为是查找li节点下的class属性,但其实只要/后面不是非节点名称比如li/@class
或者li/..
是代表li节点的class属性和li节点的父节点
结果如下class="book1"
-
表达式:
//li[1]/../@class
解释:在所有节点查找第一个li节点的父节点class属性
结果如下class="BookList"
-
表达式:
//li[1]/../li[2]/@class
解释:在所有节点查找第一个li节点的兄弟li节点的class属性
结果如下class="book2"
-
表达式:
//*[@class="price"][1]
解释:在所有节点查找class属性等于price的第一个节点
结果如下<p class="price">80元</p>
-
表达式:
//*[@class="book2" and @id="book_02"]
解释:在所有节点查找class属性等于"book2"和id属性等于"book_02"的节点
,除了and之外还有or可使用
结果如下<li class="book2" id="book_02" href="http://www.testwenxi.net/"> <p class="name">Python入门到精通</p> <p class="model">电子书</p> <p class="price">45元</p> <p class="color">蓝绿色封装</p> </li>
-
表达式:
//p[1]/text()
解释:第一个p节点中的文本内容
结果如下c语言小白变怪兽
-
表达式:
//*[contains(@class,"colo")]
解释:模糊匹配,表示选择 class中包含“colo”的所有 节点。
结果如下<p class="color">红蓝色封装</p> <p class="color">蓝绿色封装</p>
-
表达式:
//p[text()="电子书" or text()="纸质书"]
解释:查找p节点下text是电子书或纸质书的节点
结果如下<p class="model">纸质书</p> <p class="model">电子书</p>
-
表达式:
//p/../../@class
解释:在p节点上查找它父节点的父节点的class属性,也就是ul节点的class属性
结果如下:[ "BookList" ]
其他较少用到的语法:
# 选择不包含class属性的节点
var result = node.SelectNodes(".//span[not(@class)]");
# 选择不包含class和id属性的节点
var result = node.SelectNodes(".//span[not(@class) and not(@id)]");
# 选择不包含class="expire"的span
var result = node.SelectNodes(".//span[not(contains(@class,'expire'))]");
# 选择包含class="expire"的span
var result = node.SelectNodes(".//span[contains(@class,'expire')]")