背景
原先基本没咋接触前端,最近在搞Scrapy的时候顺手把XPath读了读,顺便做了点笔记。
XPath使用了路径表示法,就像在url中导航XML文档的层次结构一样。
本身XPath也并不复杂,了解下面的部分放在Scrapy中已经完全够用了。
XPath功能
XPath标记分为几类基础功能,依次简单看看:
通配节点选择
- 绝对寻址
如果路径始于/
,就意味着将从根节点开始使用绝对路径进行寻址。
/AAA
/AAA/CCC
/AAA/DDD/BBB
- 节点搜索
如果路径以//开头,则将选择文档中满足条件的所有元素。
//BBB
//DDD/BBB
- 全节点选择
*选择处理路径下的所有元素
/AAA/CCC/DDD/*
条件选择
- 数组选择
/AAA/BBB[1]
/AAA/BBB[last()]
- 属性选择
@用以指定属性
//@id
//BBB[@id]
//BBB[@*]
//BBB[not(@*)]
- 属性值选择
可以指定属性值进行选择。normailize-space可以将前导后导空格去除。
//BBB[@id=‘b1’]
//BBB[normalize-space(@name)=‘bbb’]
去除属性值的前后导空格
常用函数选择
- 节点计数选择
count()函数可以计算选中元素的子元素的数量
//*[count(BBB)=2]
选择拥有2个BBB子元素的元素
//[count()=3]
选择拥有3个子元素的元素
- 元素名
name():返回元素名
//*[name()=‘BBB’]
- 字符串操作
starts-with(A1,B1): 判定A1是否以B1为始
//*[starts-with(name(),‘B’)]
contains(A1,B1): 判定A1中是否包含B1
//*[contains(name(),‘C’)]
string-length():返回字符串长度
//*[string-length(name()) < 3]
多个XPath组合
可以由|组合多个XPath
/AAA/EEE | //BBB
/AAA/EEE | //DDD/CCC | /AAA | //BBB
相对关系轴(节点集)
- 子轴child axis
- 本节点
- 默认轴,通常可省略,名为子轴,应该理解为self
- 一个节点仅有一个本节点
/child::AAA
=/AAA
/child::AAA/child::BBB
=/child::AAA/BBB
=/AAA/child::BBB
=/AAA/BBB
- 后裔轴Descendant axis | Descendant-or-self axis
- Descendant不含本节点
- 包含本节点的递归的子孙节点
- 一个节点可以有复数个子孙节点
*Descendant-or-self 在上述的基础上增加本节点
/descendant:😗
根节点的所有后裔节点,即全节点
/AAA/BBB/descendant:😗
/AAA/BBB节点的所有后裔节点,不含节点/AAA/BBB
//CCC/descendant::DDD
选择所有DDD节点,该DDD节点应为某CCC节点的后裔
/AAA/XXX/descendant-or-self:😗
/AAA/XXX的节点及其所有后裔节点
- 父轴Parent axis
- 不包含本节点
- 包含所选择节点的父节点
- 一个节点仅有一个或0个父节点
//DDD/parent:😗
DDD节点的父节点
- 祖先轴Ancestor axisAncestor | Ancestor-or-self axis
- 不包含本节点
- 祖先轴包含了所选择节点的祖先,包含父节点即父节点的递归父节点
- 一个节点可以有复数个祖先节点
- 若选定节点非根节点,则根节点将包含在祖先轴的节点集中
*Ancestor-or-self 在上述的基础上增加本节点,必定包含根节点
//FFF/ancestor:😗
所有FFF节点的祖先节点
- 弟妹轴Following-sibling axis
- 不包含本节点
- 所有出现在选定节点后,且与选定节点同级(拥有相同的父节点)的节点
- 一个节点可以有复数个弟妹节点
//CCC/following-sibling:😗
选择所有CCC节点的弟弟
- 兄姐轴Preceding-sibling axis
- 不包含本节点
- 所有出现在选定节点前,且与选定节点同级(拥有相同的父节点)的节点
- 一个节点可以有复数个兄姐节点
/AAA/XXX/preceding-sibling:😗
选择/AAA/XXX节点的哥哥
- 后继轴 Following axis
- 不包含本节点
- 所有文档序出现在选定节点后的节点
- 不包括本节点的后裔节点和祖先节点
- 包括本节点的所有弟妹节点
- 包括本节点祖先的所有弟妹节点
- 一个节点可以有复数个后继节点
//ZZZ/following:😗
所有ZZZ节点的后继节点
-先导轴 Preceding axis
- 不包含本节点
- 所有文档序出现在选定节点前的节点
- 不包括本节点的后裔节点和祖先节点
- 包括本节点的所有兄姐节点
- 包括本节点祖先的所有兄姐节点
- 一个节点可以有复数个先导节点
/AAA/XXX/preceding:😗
所有/AAA/XXX节点的先导节点
- 轴的正交性 Orthogonal axes
ancestor, descendant, following, preceding and self(child)轴可以将XPath文档划分为正交的几部分,他们相互不重叠,叠加后可构成完整的文档。
//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*
=//*
数值运算
除了加减外,支持以下操作符(其实应该属于一看就懂的):
- div:执行浮点除法
- mod:操作符返回截断除法的余数
- floor:向下取整
- ceiling:向上取整
参考
- http://www.zvon.org/comp/r/tut-XPath_1.html#Pages~List_of_XPaths
- https://www.runoob.com/xpath/xpath-tutorial.html