xpath用于XML解析,也可以用于HTML网页的解析。
对于HTML的解析概括起来就是:找到HTML中某个节点上下左右前后节点,然后对这些节点进行取值。
所以本文的思路就是介绍如何使用xpath对目标节点上下左右前后节点的选择。包括以下内容:
- 所有节点
- 根节点
- 父节点的选择
- 子节点的选择
- 前面的节点的选择
- 后面的节点的选择
语法
在正式介绍之前首先介绍的是xpath的语法。
xpath的语法和文本的路径类似,比如在ubuntu中某个路径为/home/user/data,这表示根目录下home文件夹下user文件夹下的data文件夹。同理,xpath中/表示根节点,而//表示文档中所有节点。
1
2
/node表示根下的node节点
//node表示文档中的所有node节点
所有节点
所有节点的选择通过*进行。
比如要选择某个节点下的所有节点,表示为//node/*。
父节点和子节点
父节点表示当前节点的上一级节点。比如node节点的父节点表示为//node/parent::*。
子节点表示当前节点的下一级节点。比如node节点的子节点表示为//node/child::*。
祖先节点和孙节点
祖先节点表示从根节点到当前节点的所有上级节点(不包括本节点)。比如node节点的祖先节点表示为//node/ancestor::*。
孙节点表示当前节点的所有下级节点(不包括本节点)。比如node节点的孙节点表示为//node/descendant::*。要包括本节点使用//node/descendant-or-self::*。
兄弟节点
兄弟节点表示跟当前节点同级的节点。
比如某个节点前面的所有兄弟节点(不包括本节点)//node/preceding-sibling::*。
比如某个节点后面的所有兄弟节点(不包括本节点)//node/following-sibling::*。
前后所有节点
父子节点,祖孙节点区别在于,父子节点只是对直属上下级节点的选择;祖孙节点在于从根节点到当前节点的所有节点的选择。
而前后所有节点的选择,在于除去从根节点到本节点外的所有前后节点。
前面所有节点的选择(不包括本节点)表示为//node/preceding::*。
后面所有节点的选择(不包括本节点)表示为//node/following::*。
属性操作
下面的内容介绍另一种选择节点的方法。
//node[1]:node节点的第一个//node[last()]:node节点的最后一个//@id:包含id属性的节点//node[@id]:node节点中包含id属性的节点//node[@*]:node节点中包含属性的节点//node[not(@*)]:node节点中不包含属性的节点//node[@id='b1']:node节点中包含属性id,值为b1的节点//node[normalize-space(@id)='b1']:去除属性值中的空格//*[count(node)=2]:包含node子节点超过2的节点//*[name()='node']:节点名为node//*[starts-with(name(),'B')]:节点名以B开头//*[contains(name(),'C')]:节点名包含C//*[string-length(name()) = 3]:节点名长度等于3//node1 | //node2:选择node1和node2的并集