python xpath 基本用法

2021-07-01 18:11:14 字數 4789 閱讀 5740

在進行網頁抓取的時候,分析定位html節點是獲取抓取資訊的關鍵,目前我用的是lxml模組(用來分析xml文件結構的,當然也能分析html結構), 利用其lxml.html的xpath對html進行分析,獲取抓取資訊;以下是關於xpath的一些基本用法:

在介紹xpath的匹配規則之前,我們先來看一些有關xpath的基本概念。首先要說的是xpath資料型別。xpath可分為四種資料型別:

節點集(node-set)

節點集是通過路徑匹配返回的符合條件的一組節點的集合。其它型別的資料不能轉換為節點集。

布林值(boolean)

由函式或布林表示式返回的條件匹配值,與一般語言中的布林值相同,有true和false兩個值。布林值可以和數值型別、字串型別相互轉換。

字串(string)

字串即包含一系列字元的集合,xpath中提供了一系列的字串函式。字串可與數值型別、布林值型別的資料相互轉換。

數值(number)

在xpath中數值為浮點數,可以是雙精度64位浮點數。另外包括一些數值的特殊描述,如非數值nan(not-a-number)、正無窮大 infinity、負無窮大-infinity、正負0等等。number的整數值可以通過函式取得,另外,數值也可以和布林型別、字串型別相互轉換。

其中後三種資料型別與其它程式語言中相應的資料型別差不多,只是第一種資料型別是xml文件樹的特有產物。另外,由於xpath包含的是對文件結構樹的一系列操作,因此搞清楚xpath節點型別也是很必要的。由於xml文件的邏輯結構,乙個xml檔案可以包含元素、cdata、注釋、處理指令等邏輯要素,其中元素還可以包含屬性,並可以利用屬性來定義命名空間。相應地,在xpath中,將節點劃分為七種節點型別:

根節點(root node)

根節點是一棵樹的最上層,根節點是唯一的。樹上其它所有元素節點都是它的子節點或後代節點。對根節點的處理機制與其它節點相同。在xslt中對樹的匹配總是先從根節點開始。

元素節點(element nodes)

元素節點對應於文件中的每乙個元素,乙個元素節點的子節點可以是元素節點、注釋節點、處理指令節點和文字節點。可以為元素節點定義乙個唯一的標識id。

元素節點都可以有副檔名,它是由兩部分組成的:一部分是命名空間uri,另一部分是本地的命名。

文字節點(text nodes)

文字節點包含了一組字元資料,即cdata中包含的字元。任何乙個文字節點都不會有緊鄰的兄弟文字節點,而且文字節點沒有副檔名。

屬性節點(attribute nodes)

每乙個元素節點有乙個相關聯的屬性節點集合,元素是每個屬性節點的父節點,但屬性節點卻不是其父元素的子節點。這就是說,通過查詢元素的子節點可以匹配出元素的屬性節點,但反過來不成立,只是單向的。再有,元素的屬性節點沒有共享性,也就是說不同的元素節點不共有同乙個屬性節點。

對預設屬性的處理等同於定義了的屬性。如果乙個屬性是在dtd宣告的,但宣告為#implied,而該屬性沒有在元素中定義,則該元素的屬性節點集中不包含該屬性。

此外,與屬性相對應的屬性節點都沒有命名空間的宣告。命名空間屬性對應著另一種型別的節點。

命名空間節點(namespace nodes)

每乙個元素節點都有乙個相關的命名空間節點集。在xml文件中,命名空間是通過保留屬性宣告的,因此,在xpath中,該類節點與屬性節點極為相似,它們與父元素之間的關係是單向的,並且不具有共享性。

處理指令節點(processing instruction nodes)

處理指令節點對應於xml文件中的每一條處理指令。它也有副檔名,副檔名的本地命名指向處理物件,而命名空間部分為空。

注釋節點(comment nodes)

注釋節點對應於文件中的注釋。下面,我們來構造一棵xml文件樹:

現在,來實現一些利用xpath使xml中節點匹配的基本方法。

路徑匹配

路徑匹配與檔案路徑的表示相仿,比較好理解。有以下幾個符號:

符  號

含  義

舉  例

匹配結果

/指示節點路徑

/a/c/d

節點」a」的子節點」c」的子節點」d」,即id值為d2的d節點

/根節點

//所有路徑以」//」後指定的子路徑結尾的元素

//e所有e元素,結果是所有三個e元素

//c/e

所有父節點為c的e元素,結果是id值為e1和e2的兩個e元素

*路徑的萬用字元

/a/b/c/*

a元素→b元素→c元素下的所有子元素,即name值為b的b元素、id值為d1的d元素和id值為e1和e2的兩個e元素

/*/*/d

上面有兩級節點的d元素,匹配結果是id值為d2的d元素

//*所有的元素

|邏輯或

//b | //c

所有b元素和c元素

位置匹配

對於每乙個元素,它的各個子元素是有序的。如:

舉  例

含  義

匹配結果

/a/b/c[1]

a元素→b元素→c元素的第乙個子元素

name值為b的b元素

/a/b/c[last()]

a元素→b元素→c元素的最後乙個子元素

id值為e2的e元素

/a/b/c[position()>1]

a元素→b元素→c元素之下的位置號大於1的元素

id值為d1的d元素和兩個具有id值的e元素

屬性及屬性值

在xpath中可以利用屬性及屬性值來匹配元素,要注意的是,元素的屬性名前要有」@」字首。例如:

舉  例

含  義

匹配結果

//b[@id]

所有具有屬性id的b元素

id值為b1和b2的兩個b元素

//b[@*]

所有具有屬性的b元素

兩個具有id屬性的b元素和乙個具有name屬性b元素

//b[not(@*)]

所有不具有屬性的b元素

a元素→c元素下的b元素

//b[@id="b1"]

id值為b1的b元素

a元素下的b元素

親屬關係匹配

xml文件可歸結為樹型結構,因此任何乙個節點都不是孤立的。通常我們把節點之間的歸屬關係歸結為一種親屬關係,如父親、孩子、祖先、後代、兄弟等等。在對元素進行匹配時,同樣可以用到這些概念。例如:

舉  例

含  義

匹配結果

//e/parent::*

所有e節點的父節點元素

id值為a1的a元素和id值為c1的c元素

//f/ancestor::*

所有f元素的祖先節點元素

id值為a1的a元素和id值為c2的c元素

/a/child::*

a的子元素

id值為b1、b2的b元素,id值為c2的c元素,以及沒有任何屬性的e元素

/a/descendant::*

a的所有後代元素

除a元素以外的所有其它元素

//f/self::*

所有f的自身元素

f元素本身

//f/ancestor-or-self::*

所有f元素及它的祖先節點元素

f元素、f元素的父節點c元素和a元素

/a/c/descendant-or-self::*

所有a元素→c元素及它們的後代元素

id值為c2的c元素、該元素的子元素b、d、f元素

/a/c/following-sibling::*

a元素→c元素的緊鄰的後序所有兄弟節點元素

沒有任何屬性的e元素

/a/c/preceding-sibling::*

a元素→c元素的緊鄰的前面所有兄弟節點元素

id值為b1和b2的兩個b元素

/a/b/c/following::*

a元素→b元素→c元素的後序的所有元素

id為b2的b元素、無屬性的c元素、無屬性的b元素、id為d2的d元素、無屬性的f元素、無屬性的e元素。

/a/c/preceding::*

a元素→c元素的前面的所有元素

id為b2的b元素、id為e2的e元素、id為e1的e元素、id為d1的d元素、name為b的b元素、id為c1的c元素、id為b1的b元素

條件匹配

條件匹配就是利用一些函式的運算結果的布林值來匹配符合條件的節點。常用於條件匹配的函式有四大類:節點函式、字串函式、數值函式、布林函式。例如前面提到的last()、position()等等。這些功能函式可以幫助我們精確尋找需要的節點。

函式功能及作用 :

count()功能 : 統計計數,返回符合條件的節點的個數

number()功能 : 將屬性的值中的文字轉換為數值

substring() 功能

語法:substring(value, start, length)

擷取字串

sum()功能 : 求和

這些功能只是xpath語法中的一部分,還有大量的功能函式沒有介紹,而且目前xpath的語法仍然在不斷發展中。通過這些函式我們可以實現更加複雜的查詢和操作。

以上這些匹配方法中,用得最多的還要數路徑匹配。依靠給出相對於當前路徑的子路徑來定位節點的。

import lxml.html

html = '''

數量: 1

'''doc = lxml.html.fromstring(html)

numlist = doc.xpath('//td[@style="padding-bottom: 5px;" and @nowrap="" and not(@align="right")]/text()')

python xpath解析基本用法

常用便捷高效 原理 1.例項化乙個etree的物件,且需要將被解析的頁面原始碼資料載入到該物件中。2呼叫etree物件中的xpath方法結合著xpath表示式實現標籤的定位和內容的捕獲 環境安裝 pip install lxml 如何例項化乙個etree物件 1.將本地的html文件的原始碼資料載入...

python xpath的基本用法

xpath是一種在xml文件中查詢資訊的語言,使用路徑表示式在xml文件中進行導航。學習xpath需要對xml和html有基本的了解。在xpath中,有七種型別的節點 文件 根 節點 元素 屬性 文字 命名空間 處理指令 注釋,xml 文件是被作為節點樹來對待的,樹的根被稱為文件節點或者根節點。xm...

python xpath 簡單語法

item price response.xpath span class p price span 2 text extract first 1.開頭表示如果我們不想定義它的父元素,就用 表示 2.匹配具體的屬性值,這裡是class p price的 3.xpath一級級用 來 4.2 表示第二個元...