笔记-爬虫-XPATH
1. xpath
XPath是W3C的一个标准。它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计。目前有XPath1.0和XPath2.0两个版本。其中Xpath1.0是1999年成为W3C标准,而XPath2.0标准的确立是在2007年
XPath 是一门在 XML 文档中查找信息的语言
全称为XML Path Language 一种小型的查询语言
XPath 是一门在 XML 文档中查找信息的语言。
XPath 是 XSLT 中的主要元素。
XQuery 和 XPointer 均构建于 XPath 表达式之上
XPath属于lxml库模块,所以首先要安装库lxml
2. 节点
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
请看下面这个 XML 文档:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
上面的XML文档中的节点例子:
<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)
基本值(或称原子值,Atomic value)
基本值是无父或无子的节点。
项目(Item)
项目是基本值或者节点。
2.1. 节点关系
2.1.1. 父(Parent)
每个元素以及属性都有一个父。
在下面的例子中,book 元素是 title、author、year 以及 price 元素的父:
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
2.1.2.
子(Children)
元素节点可有零个、一个或多个子。
在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
2.1.3.
同胞(Sibling)
拥有相同的父的节点
在下面的例子中,title、author、year 以及 price 元素都是同胞:
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
2.1.4.
先辈(Ancestor)
某节点的父、父的父,等等。
在下面的例子中,title 元素的先辈是 book 元素和 bookstore 元素:
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
2.1.5.
后代(Descendant)
某个节点的子,子的子,等等。
某个节点的子,子的子,等等。
在下面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
3.
XPath 语法
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
3.1.1.
常用的路径表达式:
表达式 | 描述 | 实例 | ||||||
nodename | 选取nodename节点的所有子节点 | xpath(‘//div’) | 选取了div节点的所有子节点 | |||||
/ | 从根节点选取 | xpath(‘/div’) | 从根节点上选取div节点 | |||||
// | 选取所有的匹配节点,不考虑他们的位置 | xpath(‘//div’) | 选取所有的div节点 | |||||
. | 选取当前节点 | xpath(‘./div’) | 选取当前节点下的div节点 | |||||
.. | 选取当前节点的父节点 | xpath(‘..’) | 回到上一个节点 | |||||
@ | 选取属性 | xpath(’//@calss’) | 选取所有的class属性 | |||||
3.1.2.
谓语
谓语被嵌在方括号内,用来查找某个特定的节点或包含某个制定的值的节点
表达式 | 结果 | |||
xpath(‘/body/div[1]’) | 选取body下的第一个div节点 | |||
xpath(‘/body/div[last()]’) | 选取body下最后一个div节点 | |||
xpath(‘/body/div[last()-1]’) | 选取body下倒数第二个div节点 | |||
xpath(‘/body/div[positon()<3]’) | 选取body下前两个div节点 | |||
xpath(‘/body/div[@class]’) | 选取body下带有class属性的div节点 | |||
xpath(‘/body/div[@class=”main”]’) | 选取body下class属性为main的div节点 | |||
xpath(‘/body/div[price>35.00]’) | 选取body下price元素值大于35的div节点 | |||
3.1.3.
通配符
Xpath通过通配符来选取未知的XML元素
表达式 | 结果 | ||
xpath(’/div/*’) | 选取div下的所有子节点 | ||
xpath(‘/div[@*]’) | 选取所有带属性的div节点 | ||
node() | 匹配任何类型的节点 | ||
3.1.4.
取多个路径
使用“|”运算符可以选取多个路径
表达式 | 结果 | |||
xpath(‘//div|//table’) | 选取所有的div和table节点 | |||
3.1.5.
Xpath轴
轴可以定义相对于当前节点的节点集
轴名称 | 表达式 | 描述 | ||||
ancestor | xpath(‘./ancestor::*’) | 选取当前节点的所有先辈节点(父、祖父) | ||||
ancestor-or-self | xpath(‘./ancestor-or-self::*’) | 选取当前节点的所有先辈节点以及节点本身 | ||||
attribute | xpath(‘./attribute::*’) | 选取当前节点的所有属性 | ||||
child | xpath(‘./child::*’) | 返回当前节点的所有子节点 | ||||
descendant | xpath(‘./descendant::*’) | 返回当前节点的所有后代节点(子节点、孙节点) | ||||
following | xpath(‘./following::*’) | 选取文档中当前节点结束标签后的所有节点 | ||||
following-sibing | xpath(‘./following-sibing::*’) | 选取当前节点之后的兄弟节点 | ||||
parent | xpath(‘./parent::*’) | 选取当前节点的父节点 | ||||
preceding | xpath(‘./preceding::*’) | 选取文档中当前节点开始标签前的所有节点 | ||||
preceding-sibling | xpath(‘./preceding-sibling::*’) | 选取当前节点之前的兄弟节点 | ||||
self | xpath(‘./self::*’) | 选取当前节点 | ||||
3.1.6.
XPATH函数
使用函数能够更好的进行模糊搜索
函数 | 用法 | 解释 | ||||
starts-with | xpath(‘//div[starts-with(@id,”ma”)]‘) | 选取id值以ma开头的div节点 | ||||
contains | xpath(‘//div[contains(@id,”ma”)]‘) | 选取id值包含ma的div节点 | ||||
and | xpath(‘//div[contains(@id,”ma”) and | 选取id值包含ma和in的div节点 | ||||
text() | xpath(‘//div[contains(text(),”ma”)]‘) | 选取节点文本包含ma的div节点 | ||||