
2.3 网页分析方法2:XPath语法
XPath为XML路径语言(XML Path Language),是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构提供在数据结构树中找寻节点的能力。虽然XPath被设计用来查找定位XML文档,不过在HTML文档中也能很好地工作,而且主流浏览器大多支持通过此功能来查找节点元素。因此,在爬虫开发中,必备技能便是通过XPath提取网页信息。
XPath以节点来解析文档,然后通过路径表达式定位元素,再经过XPath轴和运算符的进一步筛选,达到提取规定数据的目的。
2.3.1 XPath节点
在XPath中,有7种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML文档是被作为节点树来看待的。树的根被称为文档节点或者根节点。
有如下XML文档:

上面的XML文档中包括的节点如下:
- <school>文档节点
- <name>元素节点
- lang="en"属性节点
节点组合在一起便会产生相对应的节点关系,包括父(Parent)、子(Childen)、同胞(Sibling)、先辈(Ancestor)、后代(Descendant)。
- student是name、age、gender的父,school是student的父。
- name、age、gender是student的子,student是school的子。
- name、age、gender都是同胞。
- school、student是name、age、gender的先辈,因此,先辈是节点的父、父的父等。
- school的后代是name、age、gender、student,也就是节点的子、子的子等。
2.3.2 XPath语法
XPath使用路径表达式来选取XML文档中的节点或节点集。节点是通过沿着路径(Path)或者步(Steps)来选取的。通过下面的演示文档来看看如何选取节点:

常用的节点选取路径表达式如表2-1所示。
表2-1 XPath路径表达式

通过使用上面的路径表达式,我们对示例文档中的内容进行选取,如表2-2所示。
表2-2 节点选取示例

表2-2中的表达式选取的都是某一类指定的节点,如果要选取指定的某一个节点,就需要用谓语,也就是特殊的限定条件,使用方法如表2-3所示。
表2-3 选取指定节点

在XPath中,使用通配符“*”来匹配未知元素。表2-4列出了一些通配元素路径表达式以及匹配结果。
表2-4 “*”通配符

如果匹配多个路径,则可以使用“|”运算符,使用方式及匹配结果如表2-5所示。
表2-5 “|”运算符

2.3.3 XPath轴
轴(Axis)可定义相对于当前节点的节点集。XPath使用位置路径匹配节点位置,而位置路径类型包括绝对路径与相对路径。绝对路径起始于“/”,相对路径没有限制。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:绝对路径/step/step/...,相对路径step/step/...。每个步均根据当前节点集中的节点进行计算,轴的存在可使节点提取变得更加灵活准确。
XPath轴中的节点集如表2-6所示。
表2-6 XPath轴节点

步包括:
- 轴(Axis),定义所选节点与当前节点之间的树关系。
- 节点测试(Node-Test),识别某个轴内部的节点。
- 零个或者更多谓语(Predicate),更深入地提炼所选的节点集。
步的语法为:轴名称::节点测试[谓语]。
使用的测试文档如下,通过此文档进行轴的示例分析:

通过演示文档操作示例如表2-7所示。
表2-7 步的使用示例

2.3.4 XPath运算符
XPath表达式可返回节点集、字符串、逻辑值以及数字。表2-8列出了可用在XPath表达式中使用的运算符。
表2-8 XPath运算符
