天天看點

第64天: XPath 和 lxml

by 某某白米飯

XPath 全稱為 Xml Path Language,即 Xml 路徑語言,是一種在 Xml 文檔中查找資訊的語言。它提供了非常簡潔的路徑選擇表達式,幾乎所有的節點定位都可以用它來選擇。

XPath 可以用于 Xml 和 Html,在爬蟲中經常使用 XPath 擷取 Html 文檔内容。

lxml 是 Python 語言用 Xpath 解析 XML、Html文檔功能最豐富的、最容易的功能子產品。

在 XPath 中有七種節點分别是元素、屬性、文本、文檔、命名空間、處理指令、注釋,前3種節點為常用節點

請看下面的 Html 例子,(注:這個例子全文都需要使用)

在上面的例子中

在 XPath中有多中節點關系分别是父節點、子節點、同胞節點、先輩節點、後代節點

父節點:每個元素以及屬性都有一個父節點,如:div 節點的父節點是 body 節點

子節點:元素節點可有零個、一個或多個子節點,如:第一個 ul 節點的子節點是4個 li 節點

同胞節點:擁有相同的父節點的節點,如:兩個 div 節點是同胞節點

先輩節點:某節點的父節點、父節點的父節點...,如:ul 節點的先輩節點有 div 節點、body 節點

後代節點:某個節點的子節點,子節點的子節點...,如:body 節點的後代節點有div 節點、ul 節點、li 節點

表達式

描述

nodeName

選擇nodeName節點的所有子節點

/

從根節點開始

//

從比對的節點開始選擇節點

.

選擇目前節點

..

選擇目前節點的父節點

@

選擇元素

| 比對任意元素節點

@* | 比對任意屬性節點

用上面的 Html 文檔舉個例子

路徑表達式

body

選取 body 的所有子節點

/html

選取 html 節點

//div

選取所有 div 節點

//div/./h4

div 節點下的 h4 節點

../div

選取目前節點的父節點下的所有 div 節點

//@class

所有帶有 class 元素的節點

//*

選擇所有節點

//@*

選擇所有屬性節點

position()

傳回節點的 index 位置

last()

傳回節點的個數

contains(string1,string2)

string1 是否包含 string2

text()

傳回文本節點

comment()

傳回注釋節點

normalize-space(string)

去除首位空格,中間多個空格用一個空格代替

substring(string,start,len)

傳回從 start 位置開始的指定長度的子字元串,第一個字元下标為1

substring-before(string1,string2)

傳回string1中位于第一個string2之前的部分

substring-after(string1,string2)

傳回string1中位于第一個string2之後的部分

同樣用上面的Html文檔舉個例子

//div[position()>1]

選擇第二個 div 節點

//div[last()]

選擇最後一個 div 節點

contains(//h4[2],'手機')

第二個 h4 标簽是否包含手機字元串

//li/text()

li 節點中的文本内容

//div/comment()

div 節點下的 html 注釋

normalize-space(//li[@class='blank'])

li 節點下 class屬性為 blank 的文本去掉空格

substring(//h4[1],1,2)

第一個 h4 節點的前2個字

substring-before(//h4[1],'品牌商')

第一個 h4 節點的品牌商字元串之前的字元串

substring-after(//h4[1],'品牌商')

第一個 h4 節點的品牌商字元串之後的字元串

XPath 中的謂語就是删選表達式,相當于 SQL 中的 Where 條件,謂語被嵌在 [ ] 中

//div[1]

選擇第一個 div 節點

//div[2]/ul/li[last()]

選擇第二個 div 節點下的最後一個 li 節點

//div[2]/ul/li[position()>3]

選擇第二個 div 節點下的前兩個 li 節點

//ul[@class]

選擇所有帶 class 屬性的 ul 節點

//ul[@class='computer']

選擇 class 屬性為 computer 的 ul 節點

//h4[span = 4]

選擇 h4 節點下 span 值等于4的節點

以上内容介紹了 XPath 的基本文法,下面将介紹 XPath 如何在 Python 中使用。

lxml.etree 一個強大的 Xml 處理子產品,etree 中的 ElementTree 類是一個主要的類,用于對XPath的解析、增加、删除和修改節點。

etree.parse() 函數可以解析一個網頁檔案還可以解析字元串, 在網頁中下載下傳的資料一般都是字元串形式的,使用 parse(StringIO(str)) 将整個頁面内容解析加載建構一個 ElementTree 對象,ElementTree 可以使用 XPath 文法精準找到需要的資料。

1.加載頁面到記憶體

結果:

2.擷取所有 li 标簽資料

3.擷取帶 class='blank' 屬性資料

4.屬性操作

5.擷取最後一個div标簽資料

結果

6.添加子節點

7.删除子元素

8.周遊元素後代

在 google 浏覽器開發者模式下,Elements 界面選擇元素後右鍵 Copy,可以 Copy 元素的 XPath 路徑

XPath Helper 是一個 google 浏覽器插件,可以驗證 XPath 是否正确

學習了 XPAth 的知識,可以快速比對單個或多個元素節點和屬性,在工作中大大加快了工作的效率。

lxml 是一個 Python 中強大的 Xml 和 Html 處理子產品,結合 XPath 的使用在程式中快速、便捷的分析、修改網頁内容。

示例代碼:Python-100-days-day064

關注公衆号:python技術,回複"python"一起學習交流

第64天: XPath 和 lxml

作者:純潔的微笑

出處:www.ityouknow.com

資源:微信搜【純潔的微笑】關注我,回複 【程式員】【面試】【架構師】有我準備的一線程式必備計算機書籍、大廠面試資料和免費電子書。 一共1024G的資料,希望可以幫助大家提升技術和能力。

本文如對您有幫助,還請多幫 【推薦】 下此文。

點我了解:Tooool-程式員一站式導航網站