一、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 | 除法 |
= | 等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |