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
, и по мере необходимости очищайте дерево позади себя.Прочитайте это .У вас есть 3 варианта интерфейса ElementTree:
(a) import xml.etree.ElementTree as et
... написано на Python;слишком медленно
(б) import xml.etree.cElementTree as et
... написано на С;намного быстрее
(c) import lxml.etree as et
... может быть медленнее, чем (b), но имеет дополнительные функции.
Если вам нужна помощь с опцией (2), ищите SO для "[python]iterparse ", то при необходимости задайте отдельный вопрос (т.е. не задавайте в комментариях по этому вопросу).