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,我经常看到推荐两个库:lxml和ElementTree
据我所知,这两个库彼此非常相似。它们似乎都有相似的模块名称、使用指南和功能。甚至导入语句也非常相似。
# Importing lxml and ElementTree
import lxml.etree
import xml.etree.ElementTree
用于 Python 的 lxml
和 ElementTree
库之间有什么区别?
【问题讨论】:
lxml
明显更快,可用于解析 html,并支持 XPath。有专门的a section in the lxml documentation 解释差异。
lxml
也更容易与命名空间一起使用
【参考方案1】:
ElementTree 内置于 Python 标准库中,其中包括其他数据模块类型,例如 json
和 csv
。这意味着该模块随 Python 的每个安装一起提供。对于大多数普通的 XML 操作,包括构建文档树以及元素属性和节点值的简单搜索和解析,甚至命名空间,ElementTree
是一个可靠的处理程序。
Lxml 是需要安装的第三方模块。在许多方面lxml
实际上扩展 ElementTree
因为内置模块中的大多数操作都可用。这个扩展中最主要的是lxml
支持 XPath 1.0 和 XSLT 1.0。此外,lxml
可以解析不符合 XML 的 HTML 文档,因此可用于网络抓取操作,甚至可以用作 BeautifulSoup 中的解析器和 Pandas 中的引擎 pandas.read_html()
。 lxml 的其他有用的常见功能包括 pretty_print 输出、objectify
和 sax
支持。当然,作为第三方模块,与标准库相比,具有附加功能的版本也很容易访问。
【讨论】:
【参考方案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文件。