lxml 和 ElementTree 有啥区别?

Posted

技术标签:

【中文标题】lxml 和 ElementTree 有啥区别?【英文标题】:What are the differences between lxml and ElementTree?lxml 和 ElementTree 有什么区别? 【发布时间】:2018-04-24 01:38:04 【问题描述】:

说到generating XML data in Python,我经常看到推荐两个库:lxmlElementTree

据我所知,这两个库彼此非常相似。它们似乎都有相似的模块名称、使用指南和功能。甚至导入语句也非常相似。

 # Importing lxml and ElementTree
import lxml.etree
import xml.etree.ElementTree

用于 Python 的 lxmlElementTree 库之间有什么区别?

【问题讨论】:

lxml 明显更快,可用于解析 html,并支持 XPath。有专门的a section in the lxml documentation 解释差异。 lxml 也更容易与命名空间一起使用 【参考方案1】:

ElementTree 内置于 Python 标准库中,其中包括其他数据模块类型,例如 jsoncsv。这意味着该模块随 Python 的每个安装一起提供。对于大多数普通的 XML 操作,包括构建文档树以及元素属性和节点值的简单搜索和解析,甚至命名空间,ElementTree 是一个可靠的处理程序。

Lxml 是需要安装的第三方模块。在许多方面lxml 实际上扩展 ElementTree 因为内置模块中的大多数操作都可用。这个扩展中最主要的是lxml 支持 XPath 1.0 和 XSLT 1.0。此外,lxml 可以解析不符合 XML 的 HTML 文档,因此可用于网络抓取操作,甚至可以用作 BeautifulSoup 中的解析器和 Pandas 中的引擎 pandas.read_html()。 lxml 的其他有用的常见功能包括 pretty_print 输出、objectifysax 支持。当然,作为第三方模块,与标准库相比,具有附加功能的版本也很容易访问。

【讨论】:

【参考方案2】:

我不会说 lxml 比 ET 快,因为这两个模块都提供了大量的功能。为了提供一点上下文,ElementTree 还支持 XPath,但特别是 ET 有一个独特且有用的函数,称为 iterparse(),它将 XML 文档重新制作为可迭代的。这导致解析速度更快,尤其是对于大型 XML 文件。

ET API 本身创建元素类型,它们是列表和字典之间的混合交叉。对于刚接触该模块的人来说,这可能会让人头疼,但坐下来,您会发现它非常灵活。

【讨论】:

iterparse 不是 ElementTree 独有的;它也存在于 lxml 中:lxml.de/parsing.html#iterparse-and-iterwalk。并且 lxml 完全支持 XPath 1.0,而 ElementTree 只支持 XPath 功能的一个子集。

以上是关于lxml 和 ElementTree 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup:“lxml”、“html.parser”和“html5lib”解析器有啥区别?

python 分别使用Python中自带的xml.etree.ElementTree和第三方LXML来生成一个按首字母归类的城市列表XML文件。

“BeautifulSoup”和“lxml”有啥关系?

[python小记]使用lxml修改xml文件,并遍历目录

Math.E 和 e 有啥区别

python中的beautifulsoup和xpath有啥异同点