當前位置:
首頁 > 知識 > Python lxml庫簡介

Python lxml庫簡介

lxml是一個Python庫,使用它可以輕鬆處理XML和HTML文件,還可以用於web爬取。市面上有很多現成的XML解析器,但是為了獲得更好的結果,開發人員有時更願意編寫自己的XML和HTML解析器。這時lxml庫就派上用場了。這個庫的主要優點是易於使用,在解析大型文檔時速度非常快,歸檔的也非常好,並且提供了簡單的轉換方法來將數據轉換為Python數據類型,從而使文件操作更容易。

在本教程中,我們將深入研究Python的lxml庫,首先介紹如何在不同的操作系統上設置它,然後再討論它的優點和它提供的廣泛功能。

安裝

在您的系統上安裝lxml有多種方法。我們將在下面探索其中的一些。

使用pip

Pip是一個Python包管理器,用於輕鬆地將Python庫下載並安裝到本地系統中,也就是說,它下載並安裝您正在安裝的包的所有依賴項。

如果您的系統上安裝了pip,只需在終端或命令提示符中運行以下命令:

Python lxml庫簡介

使用apt-get

如果您使用的是 MacOS 或 Linux, 您可以在終端中運行以下命令來安裝 lxml:

Python lxml庫簡介

使用 easy_install

您可能不會看這一部分,但如果由於某些原因,上面的命令都不能正常運行,請嘗試使用easy_install:

Python lxml庫簡介

注意:如果您希望安裝其他特定版本的lxml,您只需要在命令提示符或終端中像這樣lxml==3.x.y來聲明它。

現在,您已經在本地機器上安裝了lxml庫的副本。現在我們來動手實踐一下,看看使用這個庫可以做哪些很酷的事情。

功能

要在程序中使用lxml庫,首先需要導入它。您可以使用以下命令:

Python lxml庫簡介

這將從lxml庫中導入我們感興趣的etree模塊。

創建HTML / XML文檔

使用etree模塊,我們可以創建XML/HTML元素及其子元素,這在我們試圖寫入或操作HTML或XML文件時非常有用。我們來嘗試使用etree創建一個HTML文件的基本結構:

Python lxml庫簡介

在上面的代碼中,您需要知道Element函數至少需要一個參數,而SubElement函數至少需要兩個參數。這是因為Element函數只「需要」將要創建的元素的名稱,而SubElement函數不僅需要根節點的名稱,還需要將要創建的子節點的名稱。

同樣重要的是,要知道這兩個函數只對它們可以接受的參數數量有一個下界,而沒有上界,因為您可以將任意多的屬性與它們關聯起來。要要向一個元素添加一個屬性,只需向(Sub)Element函數添加一個附加參數,並以attributeName="attribute value"的形式指定屬性。

我們試著運行上面所寫的代碼來獲得關於這些函數更好的直觀感覺:

Python lxml庫簡介

輸出:

Python lxml庫簡介

還有一種方法可以以分層的方式創建和組織元素。我們也來探索一下:

Python lxml庫簡介

因此,在本例中,每當我們創建一個新元素時,我們只需將它添加到根/父節點。

解析HTML / XML文檔

到目前為止,我們只考慮到創建新元素,為它們分配屬性,等等。現在我們來看一個例子,其中我們已經有一個HTML或XML文件,我們希望解析它來提取某些信息。假設我們有第一個示例中創建的HTML文件,我們來嘗試獲取一個特定元素的標記名稱,然後列印所有元素的標記名稱。

Python lxml庫簡介

輸出:

Python lxml庫簡介

現在來遍歷root節點中的所有子元素並列印它們的標籤:

Python lxml庫簡介

輸出:

Python lxml庫簡介

使用屬性

現在我們來看看如何將屬性關聯到現有元素,以及如何檢索給定元素的特定屬性的值。

使用與之前相同的root元素,嘗試以下代碼:

Python lxml庫簡介

輸出:

Python lxml庫簡介

在這裡,我們可以看到newAttribute="attributeValue"確實添加到了根元素中。

現在我們來嘗試獲取在上面代碼中設置的屬性的值。這裡我們使用root元素上的數組索引訪問子元素,然後使用get()方法檢索屬性:

Python lxml庫簡介

輸出:

Python lxml庫簡介

從元素中檢索文本

現在我們已經看到了etree模塊的基本功能,我們來嘗試對HTML和XML文件做一些更有趣的事情。這些文件的標籤之間差不多總是會有一些文本。那麼,我們來看看如何向元素添加文本:

Python lxml庫簡介

輸出:

Python lxml庫簡介

檢查元素是否有子元素

接下來,我們應該能夠檢查兩件非常重要的事情,因為在許多web爬取應用程序中都需要檢查異常處理。我們要檢查的第一件事是元素是否有子元素,第二件事是節點是否為一個Element。

我們對上面創建的節點進行以下操作:

Python lxml庫簡介

上面的代碼將輸出「True」,因為根節點確實有子節點。但是,如果我們對根節點的子節點進行相同的檢查,就像下面的代碼中所示,輸出將是「False」。

Python lxml庫簡介

輸出:

Python lxml庫簡介

現在我們來做同樣的事情看看每一個節點是否是一個Element:

Python lxml庫簡介

輸出:

Python lxml庫簡介

iselement方法有助於確定您是否有一個有效的Element對象,從而確定您是否可以使用我們在這裡展示的方法繼續遍歷它。

檢查一個元素是否有父元素

剛才,我們展示了如何沿著層次結構向下走,即如何檢查一個元素是否有子節點,現在在這一節中,我們將嘗試沿著層次結構向上走,即如何檢查並獲取一個子節點的父節點。

Python lxml庫簡介

第一行應該返回nothing(也就是None),因為根節點本身沒有任何父節點。另外兩個應該都指向根元素,即HTML標記。我們查看一下輸出,看看結果是不是我們所期望的:

輸出:

Python lxml庫簡介

檢索元素的同胞

在本節中,我們將學習如何在層次結構中橫向遍歷,它會檢索樹中元素的兄弟元素。

橫向遍歷樹與垂直導航非常相似。對於後者,我們使用getparent和元素的長度,對於前者,我們將使用getnext和getprevious函數。讓我們在之前創建的節點上嘗試一下,看看它們是如何工作的:

Python lxml庫簡介

輸出:

Python lxml庫簡介

在這裡,您可以看到root[1].getnext()檢索到了「body」標記,因為它是下一個元素,而root[1].getprevious()檢索了「head」標記。

類似地,如果我們在根節點上使用getprevious函數,它將返回None,如果我們在root[2]上使用getnext函數,它也將返回None。

從字元串解析XML

我們繼續學習,如果我們有一個XML或HTML文件,我們希望解析原始字元串以獲取或操作所需的信息,我們可以通過下面的例子來實現:

Python lxml庫簡介

輸出:

Python lxml庫簡介

如您所見,我們成功地更改了HTML文檔中的一些文本。由於我們傳遞給tostring函數一個xml_declaration參數,所以還自動添加了XML doctype聲明。

尋找元素

我們要討論的最後一點在解析XML和HTML文件時非常方便。我們將檢查一些方法,通過這些方法,我們可以查看一個Element是否具有任何特定類型的子元素,以及它是否包含一些子元素。

這有許多實際的用例,例如查找特定web頁面上的所有鏈接元素。

Python lxml庫簡介

輸出:

Python lxml庫簡介

結論

在上面的教程中,我們首先簡單介紹了什麼是lxml庫以及它的用途。之後,我們學習了如何在Windows、Linux等不同的環境中安裝它。接著,我們探索了不同的功能,這些功能可以幫助我們垂直或橫向遍歷HTML/XML樹。最後,我們還討論了如何查找樹中的元素,以及如何從這些元素中獲取信息。


英文原文:https://stackabuse.com/introduction-to-the-python-lxml-library/譯者:浣熊君( ????? )

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

如何加快Python 應用的啟動時間
優秀的開發者是培養出來的,而不是雇來的

TAG:Python部落 |