从默认的python xml.sax转换为lxml sax接口

时间:2012-02-04 18:34:08

标签: python xml sax lxml wikipedia

我正在寻求加速解析维基百科的一部分,大约5GB。现在我正在使用一个使用pythons sax接口的脚本,而lxml似乎是一个加速的直接解决方案。

但是,我对lxml sax doc有点困惑,所以任何指向简单示例的指针/链接都会有所帮助。以下是我要转换的相关脚本https://gist.github.com/1739351

2 个答案:

答案 0 :(得分:4)

lxml.sax不是xml.sax的插件替代品。它提供ADD-ON功能:

>>> import lxml.sax
>>> help(lxml.sax)
Help on module lxml.sax in lxml:

NAME
    lxml.sax - SAX-based adapter to copy trees from/to the Python standard libra
ry.

FILE
    c:\python27\lib\site-packages\lxml\sax.py

DESCRIPTION
    Use the `ElementTreeContentHandler` class to build an ElementTree from
    SAX events.

    Use the `ElementTreeProducer` class or the `saxify()` function to fire
    the SAX events of an ElementTree against a SAX ContentHandler.
[snip]

您有两种选择:

选项1:继续使用SAX,尝试通过删除所有这些断言或至少使它们更有效来加速代码,例如

def characters(self, content):
    # assert content is not None and len(content) > 0
    assert content
    # if len(self.stack) == 0:
    if not self.stack:
        return
    if self.stack[-1] == "title":
        self.title += content
    elif self.stack[-1] == "text":
        # assert self.title is not None
        assert self.title # This assertion is gross overkill IMHO
        self.text += content

选项2:忘记SAX,使用ElementTree界面,使用iterparse解析,并随时清理身后的树。阅读this。您有3个ElementTree界面选择:

(a)import xml.etree.ElementTree as et ...用Python编写;太慢了 (b)import xml.etree.cElementTree as et ...用C语言写成;更快的 (c)import lxml.etree as et ...可能比(b)慢,但有额外的功能。

如果您需要有关选项(2)的帮助,请搜索SO以查找“[python] iterparse”,然后在必要时提出单独的问题(即不要在此问题的评论中提问)。

答案 1 :(得分:0)

也许你可以试试lxml.etree,这是一种解析XML的pythonic方法,它既高效又简洁。