Python lxml库简介

albertjone 2019-04-26

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/译者:浣熊君( ・᷄৺・᷅ )

相关推荐