python中lxml.etree 和 ElementTree 的区别

2024-01-04 19:12

本文主要是介绍python中lxml.etree 和 ElementTree 的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

python中lxml.etree 和 ElementTree 的区别还是很明显的。

1.导入方式不同

# etree
from lxml.etree import Element# ElementTree
from elementtree.ElementTree import Element# ElementTree in the Python 2.5 standard library
from xml.etree.ElementTree import Element

2.lxml.etree 提供了更多的功能,例如 XPath、XSLT、Relax NG、 和 XML 模式支持,这是 (c)ElementTree 不提供的。

3.etree 对 Python unicode 字符串的想法与 ElementTree 不同。 在 API 的大多数部分中,ElementTree 使用纯字符串和 unicode 字符串 就像他们一样。这包括 Element.text、Element.tail 和许多其他 地方。但是,默认情况下,ElementTree 分析器假定任何字符串 (str 或 unicode)包含 ASCII 数据。如果出现以下情况,它们会引发异常 字符串与预期的编码不匹配。

etree 对纯字符串 (str) 的想法与 ElementTree 相同。为 但是,对于 unicode 字符串,etree 在整个 API 中都假定它们是 Python unicode 编码的字符串,而不是字节数据。这包括 解析 器。因此,将 XML unicode 数据传递到 Python unicode 字符串形式的 etree 解析器。这是一个错误,在 另一方面,如果 Unicode 字符串在其 XML 声明中指定了编码, 因为这与 Python unicode 的特征编码相冲突 字符串。

4.eTree 允许通过 getParent() 方法导航到节点的父节点,并通过调用 getNext() 和 getPrevious() 导航到同级节点。 这在 ElementTree 中是不可能的,因为基础树模型不能 有这个信息。

5.当尝试使用__setitem__实际上不是 元素,但其他一些对象,etree 会引发 TypeError,而 ElementTree 引发 AssertionError。这也适用于其他一些地方 应用程序接口。一般来说,etree 会尽量避免 AssertionErrors,而倾向于 更具体地说明异常的原因。

6.当解析失败时 iterparse() 中,ElementTree 最高可达版本 1.2.x 会引发低级 ExpatError,而不是像其他解析器那样引发 SyntaxError。lxml 和 ElementTree 1.3 都会为解析器错误引发 ParseError。

7.lxml 中的 iterparse() 函数是基于 libxml2 实现的 解析器和树生成器。这意味着对文档的修改 在解析过程中,root 或当前元素的祖先可能会刺激 解析器甚至段错误。虽然这在 Python 对象中不是问题 ElementTree 使用的结构,lxml 底层的 C 树受其影响。 因此,lxml 上 iterparse() 的黄金法则是:不要触摸 解析器稍后必须再次触及的任何内容。请参阅 LXML 解析器文档。

8.ElementTree 在解析 XML 时忽略注释和处理指令, 而 etree 将读入它们并将它们视为 Comment 或 ProcessingInstruction 元素。这一点尤为明显 在文本内容中找到注释,然后由 Comment 元素。

您可以通过将布尔值 remove_comments 和/或 remove_pis 关键字参数传递给您使用的解析器来禁用此行为。为 为了方便和支持可移植代码,您还可以使用 etree。ETCompatXMLParser 而不是默认的 etree。XMLParser。它 尝试提供与 ElementTree 解析器最接近的默认设置 尽可能。

9.lxml.etree 的 TreeBuilder 类使用不同的 start() 方法的签名。它接受额外的 参数 nsmap 来传播 元素。确保兼容性 使用 ElementTree(不支持此参数),lxml 检查 如果该方法在调用它之前接受 3 个参数,否则 删除命名空间映射。这应该适用于大多数现有的 ElementTree 代码,尽管可能仍然存在冲突的情况。

10.ElementTree 1.2 在序列化空注释(无文本)时有一个错误 参数给定)添加到 XML,etree 会成功序列化它。

11.ElementTree 在序列化的注释周围添加空格,而 lxml 则这样做 不。这意味着 ElementTree 序列化为的注释文本“text” 在 lxml 中,“<!-- text -->”将变为“<!--text-->”。

12.当字符串 '*' 在 Element.iter() 和 .find*() 方法中用作标签过滤器时,ElementTree 返回树中的所有元素,包括 注释和处理说明。lxml.etree 只返回 real 元素, 即具有字符串标签名称的树节点。如果没有过滤器,两个库 遍历所有节点。

请注意,目前只有 lxml.etree 支持传递 Element 工厂 用作过滤器以仅选择元素。两个库都支持传递 Comment 和 ProcessingInstruction 工厂来选择 各自的树节点。

13.ElementTree 将处理指令的目标合并到 PI.text 中, 而 lxml.etree 将其放入 .target 属性中并将其排除在 .text 属性。因此,ElementTree 中的 pi.text 对应于 lxml.etree 中的 pi.target + “ ” + pi.text。

14.因为 etree 是建立在 libxml2 之上的,libxml2 是命名空间前缀感知的, etree 保留命名空间声明和前缀,而 ElementTree 则倾向于 提出自己的前缀(ns0、ns1 等)。当没有命名空间前缀时 但是,etree 也会创建 ElementTree 样式前缀。

15.etree 在元素上有一个“prefix”属性(只读),使元素的 前缀,如果这是已知的,否则为 None(如果 all,或默认命名空间)。

16.etree 进一步允许将 'nsmap' 字典传递给 Element 和 SubElement 元素工厂,用于显式映射命名空间前缀 命名空间 URI。这些将被转换为 那个元素。这意味着在极少数情况下,您需要 构造一个名为“nsmap”的属性,您需要注意,与 ElementTree,则不能将其作为关键字参数传递给 Element 和 SubElement 工厂。

17.ElementTree 允许 QName 对象作为属性值,并解析其 序列化的前缀(例如,如果“p”是“myns”的命名空间前缀,则属性值 QName(“{myns}myname”) 变为“p:myname”)。lxml.etree 还允许您从 QName 实例(以及 .text)设置属性值 值),但它会立即解析它们的前缀并存储纯文本 价值。因此,如果以后修改前缀,例如将子树移动到 不同的树(重新分配前缀映射),文本值将 未更新,最终可能会得到一个未定义的前缀。

18.eTree 元素可以使用 copy.deepcopy() 和 copy.copy() 进行复制, 就像 ElementTree 一样。但是,copy.copy() 不会创建一个 在树之间共享元素的浅拷贝,因为这毫无意义 在 libxml2 树的上下文中。请注意,lxml 可以深层复制树 比 ElementTree 快得多,因此深度复制可能仍然很快 足以替换您案例中的浅层副本。

以上来自lxml.etree 的 ElementTree 兼容性

这篇关于python中lxml.etree 和 ElementTree 的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570319

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使