1

Python 3.4、etree.iterparse を使用して GB++ サイズの XML ウィキペディア ダンプ ファイルを解析します。後者の値に応じて、現在一致する<page>要素内でその値をテストしたいと思います。次に、オブジェクト全体のソース XML と、その中にネストされた要素を含むすべてのコンテンツ、つまり記事全体の XML をエクスポートします。<ns><page>

オブジェクトを反復して<page>必要なものを見つけることができますが、使用可能なすべての関数がテキスト/属性値を読み取りたいように見えますが、ソースファイルの XML コードの utf8 文字列コピーがスコープ内の完全な<page>オブジェクトに必要なだけです。これは可能ですか?

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

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xml:lang="en">
  <page>
    <title>Some Article</title>
    <ns>0</ns>
    <revision>
      <timestamp>2017-07-27T00:59:41Z</timestamp>
      <text xml:space="preserve">some text</text>
    </revision>
  </page>
  <page>
    <title>User:Wonychifans</title>
    <ns>2</ns>
    <revision>
      <text xml:space="preserve">blah blah</text>
    </revision>
  </page>
</mediawiki>

<ns>値テストを実行するための Python コードは次のとおりです。

``from lxml import etree

# store namespace string for all elements (only one used in Wikipedia XML docs)
NAMESPACE = '{http://www.mediawiki.org/xml/export-0.10/}'
ns = {'wiki' : 'http://www.mediawiki.org/xml/export-0.10/'}

context = etree.iterparse('src.xml', events=('end',))
for event, elem in context:
  # at end of parsing each
  if elem.tag == (NAMESPACE+'page') and event == 'end':
    tagNs = elem.find('wiki:ns',ns)
    if tagNs is not None:
      nsValue = tagNs.text
      if nsValue == '2':
        # export the current <page>'s XML code

この場合、2 番目の要素、つまり以下を保持する文字列のみの XML コードを抽出したいと思います。<page>

  <page>
    <title>User:Wonychifans</title>
    <ns>2</ns>
    <revision>
      <text xml:space="preserve">blah blah</text>
    </revision>
  </page>

編集:マイナーなタイプミスとより良いマークアップ

4

2 に答える 2