XPath初探笔记

背景

原先基本没咋接触前端,最近在搞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
  1. 本节点
  2. 默认轴,通常可省略,名为子轴,应该理解为self
  3. 一个节点仅有一个本节点

/child::AAA = /AAA

/child::AAA/child::BBB = /child::AAA/BBB = /AAA/child::BBB = /AAA/BBB

  • 后裔轴Descendant axis | Descendant-or-self axis
  1. Descendant不含本节点
  2. 包含本节点的递归的子孙节点
  3. 一个节点可以有复数个子孙节点

*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
  1. 不包含本节点
  2. 包含所选择节点的父节点
  3. 一个节点仅有一个或0个父节点

//DDD/parent:😗
DDD节点的父节点

  • 祖先轴Ancestor axisAncestor | Ancestor-or-self axis
  1. 不包含本节点
  2. 祖先轴包含了所选择节点的祖先,包含父节点即父节点的递归父节点
  3. 一个节点可以有复数个祖先节点
  4. 若选定节点非根节点,则根节点将包含在祖先轴的节点集中

*Ancestor-or-self 在上述的基础上增加本节点,必定包含根节点

//FFF/ancestor:😗
所有FFF节点的祖先节点

  • 弟妹轴Following-sibling axis
  1. 不包含本节点
  2. 所有出现在选定节点后,且与选定节点同级(拥有相同的父节点)的节点
  3. 一个节点可以有复数个弟妹节点

//CCC/following-sibling:😗

选择所有CCC节点的弟弟

  • 兄姐轴Preceding-sibling axis
  1. 不包含本节点
  2. 所有出现在选定节点前,且与选定节点同级(拥有相同的父节点)的节点
  3. 一个节点可以有复数个兄姐节点

/AAA/XXX/preceding-sibling:😗

选择/AAA/XXX节点的哥哥

  • 后继轴 Following axis
  1. 不包含本节点
  2. 所有文档序出现在选定节点后的节点
  3. 不包括本节点的后裔节点和祖先节点
  4. 包括本节点的所有弟妹节点
  5. 包括本节点祖先的所有弟妹节点
  6. 一个节点可以有复数个后继节点

//ZZZ/following:😗

所有ZZZ节点的后继节点

-先导轴 Preceding axis

  1. 不包含本节点
  2. 所有文档序出现在选定节点前的节点
  3. 不包括本节点的后裔节点和祖先节点
  4. 包括本节点的所有兄姐节点
  5. 包括本节点祖先的所有兄姐节点
  6. 一个节点可以有复数个先导节点

/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:向上取整

参考

  1. http://www.zvon.org/comp/r/tut-XPath_1.html#Pages~List_of_XPaths
  2. https://www.runoob.com/xpath/xpath-tutorial.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值