преобразовать в интерфейс lxml sax из стандартного python xml.sax - PullRequest
0 голосов
/ 04 февраля 2012

Я ищу, чтобы ускорить анализ части Википедии, около 5 ГБ.Прямо сейчас я использую скрипт, который использует интерфейс pythons sax, и lxml кажется прямым решением для ускорения.

Тем не менее, меня немного смущают документы lxml sax, поэтому любые указатели/ ссылки на простые примеры будут полезны.Вот скрипт, о котором я хочу рассказать, https://gist.github.com/1739351

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

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 ", то при необходимости задайте отдельный вопрос (т.е. не задавайте в комментариях по этому вопросу).

0 голосов
/ 04 февраля 2012

возможно, вы могли бы попробовать lxml.etree, это питонный способ синтаксического анализа XML, который эффективен и лаконичен.

...