2016-04-10 9 views
0

私の場合、どの方法が最善かをXMLファイルで解析する必要があります。 beautifulsoup4、ElementTreeなどかなり大きなファイルです。 私は窓10の64ビット実行しているのpython 2.7.11 32ビットPython parse xmlファイル

xmlファイルがあります:英語:それは「LANG =をするdiv XM​​L」を使用して異なる言語が含まれています、私はファイルをXMLからこの出力を取得しようとしている http://pastebin.com/jTDRwCZr

を"" for英語。これを達成するためにlxmlでbeautifulsoupをどのように使うことができるかについての助け?御時間ありがとうございます。

<tt xmlns="http://www.w3.org/2006/04/ttaf1"  xmlns:tts="http://www.w3.org/2006/04/ttaf1#styling"> 
<head> 
<styling> 
<style id="1" tts:textOutline='#000000 2px 2px' tts:color="white"/> 
</styling> 
</head> 
<body> 
<div xml:lang="English"> 
<p begin="00:00:28.966" end="00:00:31.385" style="1"> 
text text text... 
</p> 
</div> 
</body> 
</tt> 
+1

lxmlのBeautifulSoupはほとんど決して悪い選択ではありません。 – Borealid

+0

あなたが望むものは明確ではありません。あなたはちょうど英語のdivを取得し、他の言語を無視しようとしていますか? – mhawke

+0

@mhawkeええ、それは私がそれをうまく説明してくれなかったことを申し訳なく思っています。英語のdivを取得して残りの部分を無視しようとしています。 – Yami

答えて

1

リンク先のファイルは、解析して処理する別の方法を心配する必要があるほど大きくありません。 soup.find_all()上記のコードで

from bs4 import BeautifulSoup 

with open('input.xml') as infile: 
    soup = BeautifulSoup(infile, 'lxml') 
    for e in soup.find_all('div', attrs={'xml:lang': lambda value: value != 'English'}): 
     _ = e.extract() 

with open('output.xml', 'w') as outfile: 
    outfile.write(soup.prettify(soup.original_encoding)) 

がある xml:lang属性を持つすべての divのを見つけた:

あなたはBeautifulSoupでそれを行うことができ、すべての英語以外の言語div秒を削除しようとしていると仮定すると、 'English'以外の値。その後、一致する要素をextract()で削除します。最後に、結果として得られるドキュメントは、入力と同じエンコーディングを使用して新しいファイルに書き出されます(そうでない場合、デフォルトはUTF-8になります)。

+0

ええ、私は奇妙な出力ファイルをそれは英語のdivのを削除しました – Yami

+0

申し訳ありません私は最後のコメントを説明していません。上のコードは素晴らしい作品です!私は2番目のxmlファイルでそれを試したとき何らかの理由でしかし。それはすべてを取り除いた。それは他のxmlファイルと同じ書式ですが、そこに存在する唯一の違いはこの中にさらに多くの言語があることです。 https://codeshare.io/8KhNE bs4が何をしてくれたかについてのあなたの説明にも感謝したいと思います。 – Yami

+0

@ xNightmare67x:あなたの他のファイルで上記のコードを試しましたが、期待どおりに動作しました。すなわち、 '' x':lang'を ''英語 ''に設定していない' div'sをすべて削除し、 – mhawke

0

通常、DOMのアプローチは使いやすく(最大10 MB)ます。しかし、それが本当に大きなxmlファイル(> 50 MB)である場合、XML DOMアプローチは、XMLオブジェクト全体をメモリに解析するため、使用できません。最大100MBのデータを解析するのに3〜4GBのRAMが必要となり、大幅に遅くなります。 もう1つの選択肢は、XMLファイルの反復またはイベントベースの解析を行うことです。 反復解析では、elementTreeまたはlxmlアプローチを使用できます。通常、elementTreeはかなり遅いので、同様のAPIであるcElementTreeを使用することをお勧めしますが、elementTreeよりもはるかに高速なCで実装されています。 私は最近、> 100 MBの大きなXMLファイルを解析するためにelementTreeを使用しました。私はlxmlについてはわかりません。 XML解析APIの使用方法の詳細については、オンラインでチェックアウトします。