Xpath基础

433 阅读3分钟

Xpath基础

1. 单点.和双点..的概念

  • .表示当前位置节点
  • ..表示父级节点位置

2. ///的概念

  • /表示子级范围
  • //表示子孙后代范围

3. 属性检索

  • 根据属性具体判断某一个标签,可以通过标签名[属性值判断式]来定位,例如:.//div[@id="content"]
  • 这段xpath的具体意思就是全局检索id等于content的div标签。
  • 属性值可以为标签内的任何属性,例如div、class、style、href等,包括自定义属性。

4. 包含检测

  • 由于html是标记语言,所以他是没有报错机制以及严格的格式检测。但是 xpath有极其严格的语言和检测,所以xpath的书写通常需要包容html的不规则语言。
  • html标签的id属性具有唯一性,class具有通用性,而且空格是可以随意添加的。如果不能精确匹配到某一个具体的字符串,xpath可以采用包含检测的函数来指定大致的标签。
  • 举例:.//div[contains(@class,"content")]
  • 如果id为content的div标签,content字符串前后有多个空格,且很不规则,这里可以使用contains函数对id属性的值检测,只要里面包含了content字符串,就是我们需要的目标标签。

5. 与 或 非

  • 在爬虫的编写过程中,html都不会是特别简短的,而且大多特别的长,又乱。class的通用性,导致一个contains检测会拿到非常多不需要的标签,所以常常需要更严格的筛选操作。
  • xpath同样支持与或非的操作,通过 与 或 非 contains的组合使用,大部分的需要都是可以实现的。 |逻辑| 与 | 或 | 非 | |:------:|:------:|:------------:|:------------:| |关键字| and | or | not() | |示例| .//div[@id and @class]|.//div[@id or @class] | .//div[not(@id)]| |示例解释| 同时拥有id和class属性的div | 有id或者class属性的div| 没有id属性的div|

6. 选取特定位置的标签

  • 通过属性来选取标签,都是通配的标签,只要符合要求,就可以获取。当然还有一种的话,就是一排标签,只有第几个或者某个范围的标签可用,这样的话就需要指定位置或者对位置进行判断。

1. 方式一:[1]

  • 通配标签返回的是一个列表,里面为空或者一些元素。xpath支持取具体值,例如去列表的第一个元素,[1]就可以拿到;第二个值就是[2]
  • 注意列表的下角标从1开始,不像python那样从0开始。

2. 方式二:position()

  • position函数会返回当前的位置值,拿到值之后就可以对值进行判断选取。
  • 举例:.//div[position()>1]
  • 选取当前位置下的所有div标签,然后去掉第一个,取出从2开始,一直到最后一个div标签。

3. 方式三:last()

  • 这个是最简单的,就是取列表的最后一个元素。
  • 举例:.//div[last()]

7. xpath的轴

  • 其实这里有很多,xpath不仅仅只对html有效,还有xml。
  • 但是在html中,一部分xpath轴是无效的,有一部分轴是非常有用的,这里列举下:
    • following 选取文档中当前节点的结束标签之后的所有节点。
    • preceding 选取文档中当前节点的开始标签之前的所有节点。
    • ancestor 选取当前节点的所有先辈(父、祖父等)。
    • descendant 选取当前节点的所有后代元素(子、孙等)。
    • descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。