What are the differences between lxml and ElementTree?
在Python中生成XML数据时,经常会推荐使用两个库:lxml和ElementTree
据我所知,这两个库彼此非常相似。 它们似乎都具有相似的模块名称,使用准则和功能。 甚至import语句也非常相似。
1 2 3
| # Importing lxml and ElementTree
import lxml.etree
import xml.etree.ElementTree |
Python的lxml和ElementTree库之间有什么区别?
-
lxml明显更快,可用于解析HTML,并支持XPath。 lxml文档中专门有一节解释了差异。
-
lxml也更易于与名称空间一起使用
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支持。当然,作为第三方模块,与标准库相比,具有附加功能的版本也易于访问。
我不会说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功能的子集。