Cane's Blog

Cane

【Python】XPath 语法

37
2019-01-19

节点

节点类型

在 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)

返回参数节点的节点名称。

案例

  1. 获取 a 标签下所有子孙标签(包括 a,但不包括含有属性 type 的标签)的内容

    xpath("//a/descendant-or-self::*[not(@type)]/text()")
  2. 获取 a 标签下所有子孙标签(包括 a,但不包括 c 类型的标签)的内容

    xpath("//a/descendant-or-self::*[not(name(.)='c')]/text()")