笔记-爬虫-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
contains(@id,”in”)]‘)

选取id值包含ma和in的div节点

text()

xpath(‘//div[contains(text(),”ma”)]‘)

选取节点文本包含ma的div节点

       
05-26 01:14