【Python】XPath 语法
编辑节点
节点类型
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
节点关系
父(Parent)
每个元素以及属性都有一个父。
子(Children)
元素节点可有零个、一个或多个子。
同胞(Sibling)
拥有相同的父的节点
先辈(Ancestor)
某节点的父、父的父,等等。
后代(Descendant)
某个节点的子,子的子,等等。
语法
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取(取子节点) |
// | 从当前节点选择文档中的节点,而不考虑它们的位置(取子、子孙节点) |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
示例
表达式 | 描述 |
---|---|
book | 选取 div 元素的所有子节点 |
/div | 选取根元素中的子 div 节点 |
div/p | 选取属于 div 子元素的所有 p 元素 |
//p | 选取所有 p 元素,而不管它们在文档中的位置 |
div//p | 选择属于 div 元素的后代的所有 p元素,而不管它们位于 div 之下的什么位置 |
//@name | 选取名为 name 的所有属性值 |
/div/* | 选取 div 元素的所有子元素 |
//* | 选取文档中的所有元素 |
//title[@*] | 选取所有带有属性的 title 元素 |
/div/p | //span | 选取属于 div 元素的所有 p 元素,以及文档中所有的 price 元素 |
谓语示例
表达式 | 描述 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素 |
/bookstore/book[position() < 3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素 |
//title[@lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00 |
轴
轴名称 | 结果 |
---|---|
attribute | 选取当前节点的所有「属性」 |
namespace | 选取当前节点的所有「命名空间」 |
self | 选取当前节点「自身」 |
child | 选取当前节点的所有「子节点」 |
parent | 选取当前节点的所有「父节点」 |
following | 选取当前节点的所有「同级之后节点」 |
preceding | 选取当前节点的所有「同级之前节点」 |
preceding-sibling | 选取当前节点的所有「同级之前节点」(没发现和上面的区别) |
ancestor | 选取当前节点的所有「先辈节点」 |
ancestor-or-self | 选取当前节点的所有「先辈节点和自身」 |
descendant | 选取当前节点的所有「后代节点」 |
descendant-or-self | 选取当前节点的所有「后代节点和自身」 |
示例
表达式 | 描述 |
---|---|
//div[@id=“test”]/attribute::id | title | 选取 id 为 test 的 div 元素的 id 和 title 属性值 |
//div[@id=“test”]/namespace:: * | 选去 id 为 test 的 div 元素的命名空间 |
//div[@id]/self::div[@title=“test”] | 选取 具有 id 属性的 div 元素中的所有 title 为 test 的 div 元素 |
//div[@id=“test”]/child::span | 选取 id 为 test 的 div 元素的所有子节点中的 span 元素 |
//div[@id=“test”]/parent::span | 选取 id 为 test 的 div 元素的所有父节点中的 span 元素 |
//div[@id=“test”]/following::span | 选取 id 为 test 的 div 元素的所有同级之后节点中的 span 元素 |
//div[@id=“test”]/preceding::span | 选取 id 为 test 的 div 元素的所有同级之前节点中的 span 元素 |
//div[@id=“test”]/ancestor-or-self::span | 选取 id 为 test 的 div 元素的所有祖先节点(包括自己)中的 span 元素 |
//div[@id=“test”]/descendant-or-self::span | 选取 id 为 test 的 div 元素的所有后代节点(包括自己)中的span 元素 |
运算符
运算符 | 描述 |
---|---|
| | 计算两个节点集 |
+ | 加法 |
- | 减法 |
* | 乘法 |
div | 除法 |
= | 等于 |
!= | 不等于 |
< | 小于 |
<= | 小于或等于 |
> | 大于 |
>= | 大于或等于 |
or | 或 |
and | 与 |
mod | 计算除法的余数 |
常用函数
函数应在 []
中使用,通常跟在节点后面,如
/div[last()]
布尔函数
名称 | 说明 |
---|---|
boolean(arg) | 返回数字、字符串或节点集的布尔值。 |
not(arg) | 取反 |
true() | 返回布尔值 true。 |
false() | 返回布尔值 false。 |
数值函数
名称 | 说明 |
---|---|
number(arg) | 返回参数的数值。参数可以是布尔值、字符串或节点集。 |
abs(num) | 返回参数的绝对值。 |
ceiling(num) | 返回大于 num 参数的最小整数。 |
floor(num) | 返回不大于 num 参数的最大整数。 |
round(num) | 把 num 参数舍入为最接近的整数。 |
round-half-to-even() | 四舍五入 |
字符串函数
名称 | 说明 |
---|---|
string(arg) | 返回参数的字符串值 |
concat(string,string,…) | 返回字符串的拼接 |
string-length(string) | 返回字符串的长度,缺省时,返回当前节点字符串的长度 |
upper-case(string) | 返回 string 参数的大写 |
lower-case(string) | 返回 string 参数的小写 |
contains(string1,string2) | 如果 string1 包含 string2,则返回 true,否则返回 false |
starts-with(string1,string2) | 如果 string1 以 string2 开始,则返回 true,否则返回 false |
ends-with(string1,string2) | 如果 string1 以 string2 结尾,则返回 true,否则返回 false |
matches(string,pattern) | 如果 string 参数匹配指定的模式,则返回 true,否则返回 false |
存取函数
名称 | 说明 |
---|---|
name(node) | 返回参数节点的节点名称。 |
案例
获取 a 标签下所有子孙标签(包括 a,但不包括含有属性 type 的标签)的内容
xpath("//a/descendant-or-self::*[not(@type)]/text()")
获取 a 标签下所有子孙标签(包括 a,但不包括 c 类型的标签)的内容
xpath("//a/descendant-or-self::*[not(name(.)='c')]/text()")
- 0
- 0
-
赞助
微信 -
分享