一、xpath简介

xpath是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航。xpath虽然被设计搜寻XML文档,不过他也能在HTML文档中工作,且大部分浏览器也支持xpath来查询节点。在python爬虫开发中,经常使用xpath查询提取网页中的信息,因此xpath非常重要。
xpath 既然叫path,就是以路径表达式的形式来指定元素,这些路径表达式和电脑文件系统的路径表达式非常相似。由xpath一开始是搜寻XML文档的,接下来我们以XML文档为例子,从节点语法、和运算符四个方面讲解xpath的使用。

二、xpath节点

在xpath中,XML文档是被作为节点树来对待的,有七种类型的节点:元素属性文本命名空间处理指令注释以及文档(根)节点。树的根被称为文档节点或者根节点。
以下面的 XML 文档为例进行说明,文档如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book>
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

上面的XML文档中的节点例子如下:

< bookstrore>

文档节点

< author>J K. Rowling< /author>

元素节点

lang=“en”

属性节点

Harry Potter

文本节点

接着说一下节点关系

父(Parent)子(Children)同胞(Sibling)先辈(Ancestor)后代(Descendant)

在上面文档中:

  • book元素是title、author、year以及price元素的父
  • title、author、year以及price元素都是book元素的子
  • title、author、year以及price元素都是同胞节点,拥有相同的父节点
  • title元素的先辈是book元素和bookstore元素,即此节点的父,父的父
  • bookstore元素的后代是 book、title、author、year 以及 price 元素即此节点的子,子的子

三、 xpath语法

xpath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。接下来的重点是如何选取节点,下面给出一个 XML 文档进行分析:

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

我们列举出一些常用的路径表达式进行节点选取,如下

表达式

描述

nodename

选取此节点的所有子节点

/

从根节点选取

//

选择任意位置的某节点

.

选取当前节点

. .

选取当前节点的父节点

@

选取属性

通过上面的路径表达式,我们对上面的文档进行节点选取如下

路径表达式

效果

bookstore

选取 bookstore 元素的所有子节点

/bookstore

选取根元素 bookstore

bookstore/book

选取属于 bookstore 的子元素的所有 book 元素

//book

选取所有 book 子元素,而不管它们在文档中的位置

bookstore//book

选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置

//@lang

选取名为 lang 的所有属性

上面选取的例子实现的效果都是选取所有符合条件的节点,是否能选取某个特定的节点呢?这就需要用到谓语,谓语被嵌在方括号中,通过下面表格来解释谓语用法。

路径表达式

效果

/bookstore/book[1]

选取属于 bookstore 子元素的第一个 book 元素

/bookstore/book[last()]

选取属于 bookstore 子元素的最后一个 book 元素

/bookstore/book[last()-1]

选取属于 bookstore 子元素的倒数第二个 book 元素

//title[@lang=‘eng’]

选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性

/bookstore/book[price>35.00]

选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00

/bookstore/book[price>35.00]/title

选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00

xpath在节点选取的时候可以使用通用符’‘*“匹配未知的元素,同时使用操作符”|“一次选取多条路径,演示如下

路径表达式

效果

/bookstore/*

选取 bookstore 元素的所有子元素

node()

匹配任何类型的节点

四、 xpath轴

轴定义了所选节点与当前节点之间的属关系。在python爬虫开发,提取网页信息,会遇到这种情况:首先提取一个节点信息,然后在这个节点上提取它的子节点或父节点,这时候会用到轴的概念。轴的存在会使提取变得更加灵活。

轴名称

效果

ancestor

选取当前节点的所有先辈(父、祖父等)

ancestor-or-self

选取当前节点的所有先辈(父、祖父等)以及当前节点本身

attribute

选取当前节点的所有属性

child

选取当前节点的所有子元素

descendant

选取当前节点的所有后代元素(子、孙等)

descendant-or-self

选取当前节点的所有后代元素(子、孙等)以及当前节点本身

following

选取文档中当前节点的结束标签之后的所有节点

following-sibling

选取当前节点之后的所有兄弟节点

namespace

选取当前节点的所有命名空间节点

parent

选取当前节点的父节点

preceding

选取文档中当前节点的开始标签之前的所有节点

preceding-sibling

选取当前节点之前的所有同级节点

self

选取当前节点

五、xpath运算符

XPath 表达式可返回节点集、字符串、逻辑值以及数字。

运算符

描述

+

加法

-

减法

*

乘法

div

除法

=

等于

!=

不等于

<

小于

<=

小于等于

>

大于

>=

大于等于