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"一起學習交流

作者:純潔的微笑
出處:www.ityouknow.com
資源:微信搜【純潔的微笑】關注我,回複 【程式員】【面試】【架構師】有我準備的一線程式必備計算機書籍、大廠面試資料和免費電子書。 一共1024G的資料,希望可以幫助大家提升技術和能力。
本文如對您有幫助,還請多幫 【推薦】 下此文。
點我了解:Tooool-程式員一站式導航網站