首页 > Python > 正文

xpath的语法简介

标签:python

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的并集

原创文章,转载请注明出处!
本文链接:http://blog.youran.ai/posts/xpath.html
上篇: 如何打造一个个人微博爬虫
下篇: Python中的装饰器

留言: