Python lxml庫簡介
lxml是一個Python庫,使用它可以輕鬆處理XML和HTML文件,還可以用於web爬取。市面上有很多現成的XML解析器,但是為了獲得更好的結果,開發人員有時更願意編寫自己的XML和HTML解析器。這時lxml庫就派上用場了。這個庫的主要優點是易於使用,在解析大型文檔時速度非常快,歸檔的也非常好,並且提供了簡單的轉換方法來將數據轉換為Python數據類型,從而使文件操作更容易。
在本教程中,我們將深入研究Python的lxml庫,首先介紹如何在不同的操作系統上設置它,然後再討論它的優點和它提供的廣泛功能。
安裝
在您的系統上安裝lxml有多種方法。我們將在下面探索其中的一些。
使用pip
Pip是一個Python包管理器,用於輕鬆地將Python庫下載並安裝到本地系統中,也就是說,它下載並安裝您正在安裝的包的所有依賴項。
如果您的系統上安裝了pip,只需在終端或命令提示符中運行以下命令:
使用apt-get
如果您使用的是 MacOS 或 Linux, 您可以在終端中運行以下命令來安裝 lxml:
使用 easy_install
您可能不會看這一部分,但如果由於某些原因,上面的命令都不能正常運行,請嘗試使用easy_install:
注意:如果您希望安裝其他特定版本的lxml,您只需要在命令提示符或終端中像這樣lxml==3.x.y來聲明它。
現在,您已經在本地機器上安裝了lxml庫的副本。現在我們來動手實踐一下,看看使用這個庫可以做哪些很酷的事情。
功能
要在程序中使用lxml庫,首先需要導入它。您可以使用以下命令:
這將從lxml庫中導入我們感興趣的etree模塊。
創建HTML / XML文檔
使用etree模塊,我們可以創建XML/HTML元素及其子元素,這在我們試圖寫入或操作HTML或XML文件時非常有用。我們來嘗試使用etree創建一個HTML文件的基本結構:
在上面的代碼中,您需要知道Element函數至少需要一個參數,而SubElement函數至少需要兩個參數。這是因為Element函數只「需要」將要創建的元素的名稱,而SubElement函數不僅需要根節點的名稱,還需要將要創建的子節點的名稱。
同樣重要的是,要知道這兩個函數只對它們可以接受的參數數量有一個下界,而沒有上界,因為您可以將任意多的屬性與它們關聯起來。要要向一個元素添加一個屬性,只需向(Sub)Element函數添加一個附加參數,並以attributeName="attribute value"的形式指定屬性。
我們試著運行上面所寫的代碼來獲得關於這些函數更好的直觀感覺:
輸出:
還有一種方法可以以分層的方式創建和組織元素。我們也來探索一下:
因此,在本例中,每當我們創建一個新元素時,我們只需將它添加到根/父節點。
解析HTML / XML文檔
到目前為止,我們只考慮到創建新元素,為它們分配屬性,等等。現在我們來看一個例子,其中我們已經有一個HTML或XML文件,我們希望解析它來提取某些信息。假設我們有第一個示例中創建的HTML文件,我們來嘗試獲取一個特定元素的標記名稱,然後列印所有元素的標記名稱。
輸出:
現在來遍歷root節點中的所有子元素並列印它們的標籤:
輸出:
使用屬性
現在我們來看看如何將屬性關聯到現有元素,以及如何檢索給定元素的特定屬性的值。
使用與之前相同的root元素,嘗試以下代碼:
輸出:
在這裡,我們可以看到newAttribute="attributeValue"確實添加到了根元素中。
現在我們來嘗試獲取在上面代碼中設置的屬性的值。這裡我們使用root元素上的數組索引訪問子元素,然後使用get()方法檢索屬性:
輸出:
從元素中檢索文本
現在我們已經看到了etree模塊的基本功能,我們來嘗試對HTML和XML文件做一些更有趣的事情。這些文件的標籤之間差不多總是會有一些文本。那麼,我們來看看如何向元素添加文本:
輸出:
檢查元素是否有子元素
接下來,我們應該能夠檢查兩件非常重要的事情,因為在許多web爬取應用程序中都需要檢查異常處理。我們要檢查的第一件事是元素是否有子元素,第二件事是節點是否為一個Element。
我們對上面創建的節點進行以下操作:
上面的代碼將輸出「True」,因為根節點確實有子節點。但是,如果我們對根節點的子節點進行相同的檢查,就像下面的代碼中所示,輸出將是「False」。
輸出:
現在我們來做同樣的事情看看每一個節點是否是一個Element:
輸出:
iselement方法有助於確定您是否有一個有效的Element對象,從而確定您是否可以使用我們在這裡展示的方法繼續遍歷它。
檢查一個元素是否有父元素
剛才,我們展示了如何沿著層次結構向下走,即如何檢查一個元素是否有子節點,現在在這一節中,我們將嘗試沿著層次結構向上走,即如何檢查並獲取一個子節點的父節點。
第一行應該返回nothing(也就是None),因為根節點本身沒有任何父節點。另外兩個應該都指向根元素,即HTML標記。我們查看一下輸出,看看結果是不是我們所期望的:
輸出:
檢索元素的同胞
在本節中,我們將學習如何在層次結構中橫向遍歷,它會檢索樹中元素的兄弟元素。
橫向遍歷樹與垂直導航非常相似。對於後者,我們使用getparent和元素的長度,對於前者,我們將使用getnext和getprevious函數。讓我們在之前創建的節點上嘗試一下,看看它們是如何工作的:
輸出:
在這裡,您可以看到root[1].getnext()檢索到了「body」標記,因為它是下一個元素,而root[1].getprevious()檢索了「head」標記。
類似地,如果我們在根節點上使用getprevious函數,它將返回None,如果我們在root[2]上使用getnext函數,它也將返回None。
從字元串解析XML
我們繼續學習,如果我們有一個XML或HTML文件,我們希望解析原始字元串以獲取或操作所需的信息,我們可以通過下面的例子來實現:
輸出:
如您所見,我們成功地更改了HTML文檔中的一些文本。由於我們傳遞給tostring函數一個xml_declaration參數,所以還自動添加了XML doctype聲明。
尋找元素
我們要討論的最後一點在解析XML和HTML文件時非常方便。我們將檢查一些方法,通過這些方法,我們可以查看一個Element是否具有任何特定類型的子元素,以及它是否包含一些子元素。
這有許多實際的用例,例如查找特定web頁面上的所有鏈接元素。
輸出:
結論
在上面的教程中,我們首先簡單介紹了什麼是lxml庫以及它的用途。之後,我們學習了如何在Windows、Linux等不同的環境中安裝它。接著,我們探索了不同的功能,這些功能可以幫助我們垂直或橫向遍歷HTML/XML樹。最後,我們還討論了如何查找樹中的元素,以及如何從這些元素中獲取信息。
英文原文:https://stackabuse.com/introduction-to-the-python-lxml-library/譯者:浣熊君( ????? )
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※如何加快Python 應用的啟動時間
※優秀的開發者是培養出來的,而不是雇來的
TAG:Python部落 |