我正在寻求加速解析维基百科的一部分,大约5GB。现在我正在使用一个使用pythons sax接口的脚本,而lxml似乎是一个加速的直接解决方案。
但是,我对lxml sax doc有点困惑,所以任何指向简单示例的指针/链接都会有所帮助。以下是我要转换的相关脚本https://gist.github.com/1739351
答案 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方法,它既高效又简洁。