2

この質問が以前に尋ねられたかどうかはわかりませんが、見つけられなかったので、私の無知を許してください。約 40 ギグのウィキペディアの xml ダンプを解析 (ストリーム解析) したいと考えています。lxml iterparse aka stream parser を使用してこの仕事をしようとしていますが、書いたコードが何らかの理由で機能しません。やりたいことを説明する前に、この xml 形式について考えてみましょう

<root>
  <page>
    <title> A  </title>
    <text> ..........blah blah...... </text>
  </page>

  <page>
  <title> B </title>
  <text> This is a line of sample text in title B  </text>
  </page>

  <page>
  <title> C </title>
  <text> ............blah blah........ </text>
  </page>
</root>

上記の xml 構造は、wiki ダンプに非常によく似ていますが、lxml ( xml ツリー全体をメモリにロードせずに (これは不可能です)、正規表現を実行します。まさに私がやりたいことは、現在の「ページ」要素でテキストタグ「Category:Living People」内を探し、そのような一致する正規表現が見つかった場合、「テキスト」タグ内のコンテンツ全体をテキストファイル。しかし、正規表現の前に、lxml パーサー自体に問題があります。以下に試したサンプルコード。前もって感謝します :)

#LXML parser
from lxml import etree

def fast_iter(context, func):
    for event, elem in context:
        func(elem)
        elem.clear()
        while elem.getprevious() is not None:
            del elem.getparent()[0]
    del context

def process_element(elem):
    print elem.xpath( 'description/text( )' )

context = etree.iterparse( MYFILE, tag='item' )
fast_iter(context,process_element)

コードを完全に変更して、独自のバージョンを提供してください。問題が解決される限り、私は本当に気にしません!

誰か助けてください!

4

1 に答える 1

0
from xml.sax import ContentHandler, parseString
from StringIO import StringIO
from lxml import etree

CONTENT = """
<root>
  <page>
    <title> A  </title>
    <text> ..........blah blah...... </text>
  </page>

  <page>
  <title> B </title>
  <text> This is a line of sample text in title B  </text>
  </page>

  <page>
  <title> C </title>
  <text> ............blah blah........ </text>
  </page>
</root>
"""

def fast_iter(context, func):
    for action, elem in context:
        func(elem)
        elem.clear()
        while elem.getprevious() is not None:
            del elem.getparent()[0]
    del context

def process_element(elem):
    print elem.xpath( './text/text( )' )

class WikiContentHandler(ContentHandler):

    def startDocument(self):
        self.character_buffer = None

    def startElement(self, name, attrs):
        if name == 'text':
            self.character_buffer = StringIO()

    def endElement(self, name):
        if name == 'text':
            print self.character_buffer.getvalue()
            self.character_buffer.close()
            self.character_buffer = None

    def characters(self, content):
        if self.character_buffer != None:
            self.character_buffer.write(content)

def parse_wiki():
    parseString(CONTENT, WikiContentHandler())

if __name__ == '__main__':
    parse_wiki()

    context = etree.iterparse( StringIO(CONTENT), tag='page' )
    fast_iter(context, process_element)

上記は、XMLを解析する2つの方法です。1つはlxmlを使用し、もう1つはPython標準ライブラリを使用します。どちらも<text>タグ内のすべての情報を出力します。印刷ステートメントがどこにあるかを確認し、追加の処理を実行するだけです。

于 2013-01-20T03:10:37.900 に答える