社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python lxml库简介

Python程序员 • 7 年前 • 704 次点击  

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/

译者:浣熊君( ・᷄৺・᷅ )

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32135