etree.iterparseを使用してGB ++サイズのXML Wikipediaダンプファイルを解析するPython 3.4。私は現在<page>
の要素の中で<ns>
の値に応じてテストしたいと思います。後者の値に応じて、<page>
オブジェクト全体のソースXMLとその中に入れ子になっている要素、つまり記事全体のXML 。Python tree.iterparseエクスポートソースすべての子孫を含む選択された要素のXML
私はオブジェクトを反復して欲しいものを見つけることができますが、使用可能なすべての関数はテキスト/属性値を読みたいと思われますが、ソースファイルのXMLコードの完全なスコープ<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
XXXコードを抽出するには、の2番目の<page>
要素、つまり、次の文字列を保持する文字列を使用します。
<page>
<title>User:Wonychifans</title>
<ns>2</ns>
<revision>
<text xml:space="preserve">blah blah</text>
</revision>
</page>
編集:マイナータイプミスとより良いマークアップ
ありがとうございますが、XMLの例を簡略化し、XMLを再ビルドすると、プロセス全体が想像よりも複雑になります(さらに、それを行う方法もわかりません) 。 – mwra
編集のもう1つのアプローチ。 –
ありがとうございます。確かに2番目のコードはXMLファイル全体をロードする必要があり、この場合は65GBです。だから、私はiterparseを使っているのです(より正確には、このタイプのc.10GBファイルの8GB RAM MacBookAir上の他のタスクにもうまく使っています)。もう一つの問題は、コードでは ' 'がすべて同じ長さであると仮定しているため、最初のパスから' el.sourceline'値のリストを繰り返す必要があると思います。 –
mwra