lxml解析 python
介绍lxml
Python从未遭受过XML库不足的困扰。 从2.0版开始,它包含了熟悉的xml.dom.minidom
以及相关的pulldom和XML的简单API(SAX)模型。 从2.4开始,它包含了流行的ElementTree API。 另外,总是有第三方库提供更高级别或更多的pythonic接口。
尽管任何XML库都足以用于简单的文档对象模型(DOM)或小型文件的SAX解析,但是开发人员越来越面临更大的数据集,并且需要在Web服务上下文中实时解析XML。 同时,经验丰富的XML开发人员可能会更喜欢XML本机语言,例如XPath或XSLT,因为它们具有紧凑性和表达能力。 可以访问XPath的声明性语法,同时保留Python中可用的通用功能,这是理想的选择。
lxml是第一个展示高性能特性的Python XML库,它包括对XPath 1.0,XSLT 1.0,自定义元素类甚至Pythonic数据绑定接口的原生支持。 它基于两个C库建立: libxml2
和libxslt
。 它们提供了解析,序列化和转换这些核心任务背后的大部分功能。
您在代码中使用lxml的哪些部分取决于您的需求:您对XPath满意吗? 您喜欢使用类似Python的对象吗? 您在系统上有多少内存可用于保留大树?
本文不介绍lxml的全部内容,而是演示了有效处理超大型XML文件,针对高速和低内存使用进行优化的技术。 使用了两个免费的示例文档:Google转换为XML的美国版权续订数据和Open Directory RDF内容。
在这里,仅将lxml与cElementTree进行比较,而不与其他数十个可用的Python库进行比较。 我选择cElementTree是因为它是Python 2.5的本机部分,并且像lxml一样是基于C库构建的。
大数据有什么难处?
XML库通常是为小样本文件设计的,并在其中进行了测试。 实际上,许多现实世界的项目是在没有完整数据可用的情况下开始的。 程序员使用示例内容并编写如清单1所示的代码,努力工作数周或数月。
清单1.一个简单的解析操作
from lxml import etree
doc = etree.parse('content-sample.xml')
lxml parse
方法读取整个文档并构建一个内存树。 与cElementTree相比,lxml树要昂贵得多,因为它保留了有关节点上下文的更多信息,包括对父节点的引用。 以这种方式解析2G文档会立即将具有2G RAM的计算机进行交换,从而带来灾难性的性能影响。 如果在假定该数据将在内存中可用的情况下编写整个应用程序,则将进行主要重构。
迭代解析
当不希望或不希望构建内存树时,请使用不依赖于读取整个源文件的迭代解析技术。 lxml提供了两种方法:
- 提供目标解析器类
- 使用
iterparse
方法
使用目标解析器方法
目标解析器方法是熟悉SAX事件驱动代码的开发人员所熟悉的。 目标解析器是实现以下方法的类:
- 在元素打开时
start
射击。 元素的数据和子元素尚不可用。 - 在元素关闭时
end
射击。 元素的所有子节点(包括文本节点)现在都可用。 -
data
在子文本上触发,并有权访问该文本。 - 解析完成后,将
close
射击。
清单2演示了创建一个实现所需方法的目标解析器类(这里称为TitleTarget
&