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添加lxml库_Python lxml库简介相关推荐

  1. python的标识库和第三方库_Python 标准库、第三方库

    Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写.网络抓取和解析.数据连接.数清 ...

  2. python 语音播报库_python 语音库

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我需要自动分离两位发言者的声音. 我刚开始学习语音识别,我看了python的wa ...

  3. python无法卸载库_python卸载库

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 参数名类型说明必选 cas_apicasapi同上是 vault_namestr ...

  4. python turtle隐藏画笔_Python turtle库的画笔控制说明

    turtle.penup() 别名 turtle.pu() :抬起画笔海龟在飞行 turtle.pendown() 别名 turtle.pd():画笔落下,海龟在爬行 turtle.pensize(w ...

  5. python单词库_python 单词库

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python官方教程的最后一个部分就是标准库概览,在这里我们浏览一下标准库,了解 ...

  6. python控制画笔尺寸_Python turtle库的画笔控制说明

    turtle.penup() 别名 turtle.pu() :抬起画笔海龟在飞行 turtle.pendown() 别名 turtle.pd():画笔落下,海龟在爬行SRE实战 互联网时代守护先锋,助 ...

  7. python机器学习库_Python机器学习库 Top 10,你值得拥有!

    随着人工智能技术的发展与普及,Python超越了许多其他编程语言,成为了机器学习领域中最热门最常用的编程语言之一.有许多原因致使Python在众多开发者中如此受追捧,其中之一便是其拥有大量的与机器学习 ...

  8. python的所有库_Python 常用库

    前言 之前重写了视频字符画处理的代码,然后这两天又在研究命令行和网络.读了一点开源工具的代码,越来越觉得有必要针对性地学习一下一些重要的基础库. 这里呢就列个小清单,把我认为有必要学习的库写一下. 带 ...

  9. python自动控制库_python PyAUtoGUI库实现自动化控制鼠标键盘

    PyAutoGUI 不知道你有没有用过,它是一款用Python自动化控制键盘.鼠标的库.但凡是你不想手动重复操作的工作都可以用这个库来解决. 比如,我想半夜时候定时给发个微信,或者每天自动刷页面等操作 ...

  10. python 数据分析 库_Python数据分析库

    python 数据分析 库 什么是数据分析? (What is Data Analytics?) Data is power. Insights acquired from data is the k ...

最新文章

  1. 异常-java.util.concurrent.TimeoutException: Futures timed out after [100000 milliseconds]
  2. 在一个table中动态添加一行或删除一行
  3. [转] fedora linux下安装vmware tools的最好方法
  4. CentOS 7 安装nexus
  5. Java基础知识学习01-环境变量的配置、数据类型
  6. chrome恐龙游戏_如何玩没有互联网的Google Chrome恐龙游戏-在线和离线
  7. Linux如何通过命令查看日志文件的某几行(中间几行或最后几行)
  8. python读取文件时提示“UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 1264: illegal multi
  9. 接口监控_从零开始入门 K8s | 可观测性:监控与日志
  10. 如何反编译dll,并生成新的dll
  11. react 学习与使用记录
  12. STM32F103C8T6最小系统原理图和PCB
  13. SD--定价过程的16个字段的作用说明
  14. c语言有哪些系统函数,C语言常用系统函数.doc
  15. 服务器装win7自动关机,Win7系统常见的3种自动关机原因及解决方法
  16. 计算机硬件科普——GPU
  17. 创新方法72变(荣振环)
  18. 浅析微信支付:开通社交立减金活动、创建立减金及领取使用的相关文档和源码
  19. 单片机定时报警C语言程序,求一个51单片机定时闹钟程序。要C语言。能够调时间...
  20. 【最简单】STM32+ESP8266+MQTT+EMQX完成数据上传和点灯环节

热门文章

  1. vue-router之嵌套路由
  2. UIActionSheet的最后一项点击失效
  3. PHP String
  4. 数据可视化(3)--Google Charts
  5. C# 调用Dll中非托管C++代码时,函数参数的类型对照
  6. Fms3和Flex打造在线多人视频会议和视频聊天(附原代码)
  7. ASP.NET 会话状态概览
  8. GetBitmapBits和GetDIBits的区别(Windows GDI)
  9. Vue事件处理_vue的事件处理超级方便_功能强大---vue工作笔记0011
  10. k8s核心技术-Helm(自定义chart部署)---K8S_Google工作笔记0047