Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

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中rim的用法_Python并发开发简介

    Python的并发程序可以使用multiprocessing库.threading库.asyncio库.concurrent.futures库以及selectors库等等协助编写: multiproc ...

  2. qpython3h第三方库安装_Python第三方库安装

    Python有一个全球社区:https://pypi.org/,在这里我们可以搜索任何主题的Python第三方库.PyPI全称是Python Package Index,指的是Python包的索引,它 ...

  3. python爬虫提取a标签_Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释

    一.Tag(标签)对象 1.Tag对象与XML或HTML原生文档中的tag相同. from bs4 import BeautifulSoup soup = BeautifulSoup('Extreme ...

  4. python获取标签属性值_Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释

    更多python教程请到: 菜鸟教程www.piaodoo.com 人人影视www.sfkyty.com 16影视www.591319.com 星辰影院www.591319.com 一.Tag(标签) ...

  5. python中matplotlib库实例_Python Matplotlib库入门指南

    Matplotlib简介 Matplotlib是一个Python工具箱,用于科学计算的数据可视化.借助它,Python可以绘制如Matlab和Octave多种多样的数据图形.最初是模仿了Matlab图 ...

  6. python头像变二维码_Python 图像处理库 pillow,提取支付宝和微信支付图片二维码...

    下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本.本文将教你使用 Pytho ...

  7. python 删除csv第一行_python 标准库学习之 csv

    本文由作者 凭海临风 授权刊登.原文地址:https://jeffsui.github.io/2020/01/02/python-standard-library-csv/ 文档路径 官方文档:htt ...

  8. python中ln怎么表示_Python math库 ln(x)运算的实现及原理

    这个是很有用的一个运算,除了本身可以求自然对数,还是求指数函数需要用到的基础函数. 实现原理就是泰勒展开,最简单是在x=1处进行泰勒展开: 但该函数离1越远越难收敛,同时大于2时无法收敛,所以需要进行 ...

  9. python turtle库下载_python turtle库的几个小demo

    一.先上图 一个同切圆和五角星 上代码 import turtle #同切圆 turtle.pensize(2) turtle.circle(10) turtle.circle(40) turtle. ...

最新文章

  1. hung-yi lee_p3_线性回归
  2. POJ 3260 多重背包+完全背包
  3. 关于Cloud各种组件的停更/升级/替换
  4. 【学术相关】这个英文语法校正插件很赞!可以校正邮件,也可以校正论文
  5. 【CentOS Linux 7】【gcc编译器】
  6. 采用redis+ThreadLocal获取全局的登录用户信息(一)
  7. 定西市计算机考试,2019年3月甘肃省定西市计算机等级考试时间
  8. 前端学习(689):for循环执行相同代码
  9. sequelize 外键关联_mysql – Sequelize.js外键
  10. [容易]合并排序数组
  11. java.lang.ClassCastException: $Proxy8 cannot be cast to org.hihernate.lob.SerialzableClob
  12. java difftime_Java8 日期时间操作
  13. Emu8086下载和注册
  14. matlab汉明窗dft,谱分析中窗的选取
  15. Windows桌面便签小工具帮你打造高效桌面
  16. 关于安卓打包脚本aab
  17. Python爬虫系列之poizon爬虫newSign、sign、data加解密算法
  18. 经验分享 | ENVI app store
  19. stc单片机c语言程序头文件(stc12c5a60s2.h,stc12c5a60s2头文件在keil中没法用?
  20. Spring AOP编程官方文档解读之操作Advised对象

热门文章

  1. 西安交大计算机考研软件工程编程题库(二十一)
  2. c语言中的Swap函数
  3. 2022/07/17、18 day10/11:Stream流、方法引用
  4. 该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系
  5. 800A开口电流互感器(安科瑞-卓宋兰)
  6. C++获取并显示当前时间
  7. php特有的调味植物,花椒—从贵族专享到为百姓调味?
  8. OpenCV检测圆并求出圆心与半径
  9. Vue监听watch使用方法
  10. “可用不可见”: 新技术开辟数据安全共享新蓝海