xpath用于XML解析,也可以用于HTML网页的解析。
对于HTML的解析概括起来就是:找到HTML中某个节点上下左右前后节点,然后对这些节点进行取值。
所以本文的思路就是介绍如何使用xpath对目标节点上下左右前后节点的选择。包括以下内容:
在正式介绍之前首先介绍的是xpath的语法。
xpath的语法和文本的路径类似,比如在ubuntu中某个路径为/home/user/data
,这表示根目录下home文件夹下user文件夹下的data文件夹。同理,xpath中/
表示根节点,而//
表示文档中所有节点。
/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的并集