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

相关文章

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处