天天看點

XPath簡單教程

  本文參考:​​https://www.runoob.com/xpath/xpath-tutorial.html​​

  分析标準xml文檔可以使用SAX,DOM方法,但是針對Html文檔例如網站源檔案,因為格式不是完全标準的xml文檔,使用的SAX和DOM方法經常在導入的時候報格式錯誤。分析html文檔可以使用XPath

  本文通過示例來分析XPath簡單應用

  XPath是一門在XML文檔中查找資訊的語言。

  在您繼續學習之前,應該對下面的知識有基本的了解:

HTML / XHTML

XML / XML Namespaces

XPath使用路徑表達式在XML文檔中進行導航

XPath包含一個标準函數庫

XPath是XSLT中的主要元素

XPtah是一個W3C标準

  在XPath中,有七種類型的節點:元素,屬性,文檔,命名空間,注釋以及文檔(跟)節點。XML文檔是被作為節點樹來對待的。樹的跟被稱為文檔節點或者根節點。

  請看下面這個XML文檔:

  上面的XML文檔中的節點例子

  是無父或無子的節點

  基本值的例子

  項目是基本值或者節點

  每個元素以及屬性都有一個父

  在下面的列子中,book 元素是 title、author、year 以及 price 元素的父:

  元素節點可有零個、一個或多個子。

  在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:

  擁有相同的父的節點

  在下面的例子中,title、author、year 以及 price 元素都是同胞:

  某節點的父、父的父,等等。

  在下面的例子中,title 元素的先輩是 book 元素和 bookstore 元素:

  某個節點的子,子的子,等等。

  在下面的例子中,bookstore 的後代是 book、title、author、year 以及 price 元素:

  XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿着路徑或者 step 來選取的。 下面列出了最有用的路徑表達式:

<col>

表達式

描述

nodename

選取此節點的所有子節點。

/

從根節點選取(取子節點)。

//

從比對選擇的目前節點選擇文檔中的節點,而不考慮它們的位置(取子孫節點)。

.

選取目前節點。

..

選取目前節點的父節點。

@

選取屬性。

   在下面的表格中,我們已列出了一些路徑表達式以及表達式的結果:

ookstore

選取 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 元素。

/bookstore/book[position()&lt;3]

選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素。

//title[@lang]

選取所有擁有名為 lang 的屬性的 title 元素。

//title[@lang='eng']

選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。

/bookstore/book[price&gt;35.00]

選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大于 35.00。

/bookstore/book[price&gt;35.00]//title

選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大于 35.00。

  XPath 通配符可用來選取未知的 XML 元素。

通配符

*

比對任何元素節點。

@*

比對任何屬性節點。

node()

比對任何類型的節點。

  在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

/bookstore/*

選取 bookstore 元素的所有子元素。

//*

選取文檔中的所有元素。

//title[@*]

選取所有帶有屬性的 title 元素。

   通過在路徑表達式中使用"|"運算符,您可以選取若幹個路徑。

//book/title | //book/price

選取 book 元素的所有 title 和 price 元素。

//title | //price

選取文檔中的所有 title 和 price 元素。

/bookstore/book/title | //price

選取屬于 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素。

  下面列出了可用在 XPath 表達式中的運算符:

運算符

執行個體

傳回值

|

計算兩個節點集

//book | //cd

傳回所有擁有 book 和 cd 元素的節點集

+

加法

6 + 4

10

-

減法

6 - 4

2

乘法

6 * 4

24

div

除法

8 div 4

=

等于

price=9.80

如果 price 是 9.80,則傳回 true。

如果 price 是 9.90,則傳回 false。

!=

不等于

price!=9.80

如果 price 是 9.90,則傳回 true。

如果 price 是 9.80,則傳回 false。

&lt;

小于

price&lt;9.80

如果 price 是 9.00,則傳回 true。

&lt;=

小于或等于

price&lt;=9.80

&gt;

大于

price&gt;9.80

&gt;=

大于或等于

price&gt;=9.80

如果 price 是 9.70,則傳回 false。

or

price=9.80 or price=9.70

如果 price 是 9.50,則傳回 false。

and

price&gt;9.00 and price&lt;9.90

如果 price 是 8.50,則傳回 false。

mod

計算除法的餘數

5 mod 2

1

  下面通過一個執行個體來示範XPath的用法,把示範xml作為一個字元串放到一個python文檔裡面

  books.xml

  use_xpath.py

  注意:本次把xml文檔作為字元串導入到python檔案,多行文檔使用''' ''' 且符号'''需要單獨占一行不能和文檔在同一行

  以下語句導入子產品并且把文檔轉換成xpath可以分析的lxml.etree._Element對象

  代碼解析

  輸出如下,傳回一個list分别為本次查到的4個title節點,也是一個lxml.etree._Element對象,如果沒有比對到則傳回空list

  傳回list隻有一個元素

  本次找的的是下面這個title

XPath簡單教程

  輸出如下,傳回一個list值為幾本書的價格

  即以下幾個值

XPath簡單教程

  即找一下對應屬性

XPath簡單教程

   以上分析xml為一個标準xml,如果是使用xpath分析html源碼原理也是一樣的,把擷取到的html網頁源碼使用etree.HTML(html)轉換成xpath可以分析的lxml.etree._Element對象然後再使用xpath分析即可。