lxml解析 python_使用lxml在Python中进行高性能XML解析

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库建立: libxml2libxslt 。 它们提供了解析,序列化和转换这些核心任务背后的大部分功能。

您在代码中使用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事件驱动代码的开发人员所熟悉的。 目标解析器是实现以下方法的类:

  1. 在元素打开时start射击。 元素的数据和子元素尚不可用。
  2. 在元素关闭时end射击。 元素的所有子节点(包括文本节点)现在都可用。
  3. data在子文本上触发,并有权访问该文本。
  4. 解析完成后,将close射击。

清单2演示了创建一个实现所需方法的目标解析器类(这里称为TitleTarget &

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值