3

私は非常に大きな(7GB)MediaWiki XMLダンプを持っています。これは、Wikiの各ページに加えられた各変更の記録で構成されています。どのユーザーが各ページに貢献したかを記録しようとしているので、XMLからそれを抽出したいと思います。

XMLは次のようになります。

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/">
 <page>
  <title>Unique Page title</title>
  <id>11</id>
  <restrictions>sysop</restrictions>
  <revision>
    <id>11</id>
    <timestamp>2005-10-26T02:23:03Z</timestamp>
    <contributor>
      <ip>MediaWiki default</ip>
    </contributor>
    <text xml:space="preserve">i</text>
  </revision>
 </page>
 <page> ... </page>
 <page> ... </page>
 ...
</mediawiki>

このサイズのファイルの場合、iterparseを使用する必要があると思います。今のところ、タイトルを印刷しようとしていますが、次のコードを実行すると、「なし」と出力されます。

NS = '{http://www.mediawiki.org/xml/export-0.3/}'
from xml.etree.ElementTree import iterparse
with open('XMLFile.xml') as f:
    for event, elem in iterparse(f):
        if elem.tag == NS + 'page':
            for node in elem:
                if node.tag == NS + 'title':
                    print node.text()
        elem.clear()
4

3 に答える 3

3

二次ループを実行する代わりに、反復解析中に「title」要素を直接引き出してみてください。

NS = '{http://www.mediawiki.org/xml/export-0.3/}'
from xml.etree.ElementTree import iterparse
with open('XMLFile.xml') as f:
    for event, elem in iterparse(f):
            if elem.tag == NS + 'title':
                print elem.text
            elem.clear()

私のために働くようです。

于 2012-12-31T20:30:40.227 に答える
1

Pythonとiterparseを使用した経験はありませんが、一般的に、反復XMLパーサーを使用してこれを行う方法は次のようになります。

  • 解析ループの外側で、現在のページタイトルと寄稿者のリストを格納する変数を設定します。
  • ループ内では、pageタグが開かれるたびに、変数をリセットします。
  • タグに遭遇したらtitle、ページタイトル変数をその内容に設定します。
  • タグに遭遇したらcontributor、その内容を寄稿者のリストに追加します。
  • pageタグを閉じると、収集したタイトルと寄稿者リストを出力します。
于 2013-01-01T19:06:01.030 に答える
1

「早すぎる」を使用しているため、要素Noneのテキストコンテンツを印刷するときに取得します。デフォルトでは、「終了」イベントのみが生成されます。の「終了」イベントが発行されると、を含むすべてのサブ要素がすでにクリア(空)されています。titleelem.clear()iterparse()pagetitle

elem.clear()問題のコードでインデントレベルを1つ(4つのスペース)だけ右に移動すると、期待どおりに機能します。コードを機能させるもう1つの方法は、に変更iterparse(f)することiterparse(f, events=["start"])です。

そして、node.text()あるべきですnode.text

の詳細については、 http://effbot.org/zone/element-iterparse.htmを参照してくださいiterparse()


XMLダンプ(mw.xml)が次のようになっていると仮定します。

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/">
  <page>
    <title>Unique Page title 1</title>
    <id>11</id>
    <restrictions>sysop</restrictions>
    <revision>
      <id>11</id>
      <timestamp>2005-10-26T02:23:03Z</timestamp>
      <contributor>
       <username>Alice</username>
      </contributor>
      <text xml:space="preserve">i</text>
    </revision>
  </page>

  <page>
    <title>Unique Page title 2</title>
    <id>11</id>
    <restrictions>sysop</restrictions>
    <revision>
      <id>11</id>
      <timestamp>2005-10-26T02:23:03Z</timestamp>
      <contributor>
       <username>Bob</username>
      </contributor>
      <text xml:space="preserve">j</text>
    </revision>
  </page>
</mediawiki>

タイトルと寄稿者を取得する方法についての提案は次のとおりです。

from xml.etree.ElementTree import iterparse

NS = '{http://www.mediawiki.org/xml/export-0.3/}'

with open('mw.xml') as f:
    for event, elem in iterparse(f):
        if elem.tag == '{0}page'.format(NS):
            title = elem.find("{0}title".format(NS))
            contr = elem.find(".//{0}username".format(NS))

            if title is not None:
                print title.text
            if contr is not None:
                print contr.text

            elem.clear()

出力:

Unique Page title 1 
Alice
Unique Page title 2 
Bob

寄稿者のユーザー名が必要だと思います。最新のXMLスキーマによると、、、、および/または子要素contributorを含めることができます(これはスキーマの0.3バージョンにも当てはまります)。usernameipid

于 2013-01-02T19:48:18.490 に答える