2017-07-28 13 views
1

私は初心者のスクレーパーであり、プログラミングの経験は全くありません。Pythonで大容量のxmlファイルを解析しようとしています - メモリエラー

私は、Canopy環境でPythonを使用してダウンロードしたXMLファイルをいくつか掻き集め、xml.domパーサを使用しています。私は単に最初からの書誌特許出願番号からタグを削り取ろうとしています(これは私が[0]を使っている理由です)、私はどのようにデータセット全体を解析して保存したいのか見ています;一度にすべてを行うのではなく、 XMLからの抜粋は以下のようになります。コードが完全に走った後

from xml.dom import minidom 

filename = "C:/Users/SMOLENSK/Documents/Inventor Research/xml_2009/ipg091229.xml" 

f = open(filename, 'r') 

doc = f.read() 

f.close() 

xmldata = '<root>' + doc + '</root>' 

data = minidom.parse(xmldata) 

US_Biblio = xmldata.getElementsByTagName("us-bibliographic-data-grant")[0] 

pat_num = US_Biblio.getElementsByTagName("doc-number")[0] 

dates = pat_num.getElementsByTagName("date") 

for date in dates: 
    print(date) 

は、今私はメモリエラーのためにいくつかのメッセージを得ているが、それだけでされています:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-23.dtd" [ ]> 
<us-patent-grant lang="EN" dtd-version="v4.2 2006-08-23" file="USD0606726-20091229.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20091214" date-publ="20091229"> 
<us-bibliographic-data-grant> 
<publication-reference> 
<document-id> 
<country>US</country> 
<doc-number>D0606726</doc-number> 
<kind>S1</kind> 
<date>20091229</date> 
</document-id> 
</publication-reference> 
<application-reference appl-type="design"> 
<document-id> 
<country>US</country> 
<doc-number>29299001</doc-number> 
<date>20071217</date> 

私のコードは、これまでのところ、このようになります。残念ながら、私は正確に何が起こったかを書き留めることができませんでした。データの負荷が高いため(このファイルだけでも、460万行になる)、毎回ほとんどの操作がクラッシュし、エラーを再現することができません。

コードに間違いがありますか?私のコードは、各タグ名の格納を開始する前に、データセット全体を解析していますが、特定の量だけを解析する方法はありますか?おそらく、最初のセットで新しいxmlファイルを作成するだけです。

あなたが迷っているなら、私は私が事前になっていた

ExpatError: junk after line xxx

の問題を回避するために使用。私は私のコーディングスキルが驚くべきではないことを知っているので、うまくいけば、私は単純で嫌なプログラミングエラーを作らなかった。

+0

あなたは ''タグを追加するために、ファイル全体を複製しています。 'minidom.parse'は' file'オブジェクトをとります。 'with'と' data = minidom.parse(f) 'を使ってリキャストしてみてください。 –

+0

ちょっと、マイク。私が「xmldata」について何を意味しているのか理解していますが、私は「 ''と再使用する」方法がわかりません。あなたは偶然の事例を明確にするのに役立つでしょうか? – HelloToEarth

+0

... [大規模なXMLファイルのためにPython Iterparseを使う](https://stackoverflow.com/q/7171140/2823755)...おそらくlxmlを試してみてください。また、minidomnには、未使用のものを解放するのに役立つ[unlink](https://docs.python.org/3/library/xml.dom.minidom.html#xml.dom.minidom.Node.unlink)メソッドがあります。検索を絞り込んで新しい割り当てを行うたびに(例えば、 '' 'US_Biblio = ...' ''、前の変数を削除しようとすると(例えば( '' 'del data' '')) – wwii

答えて

0

試してみてください。

with open(filename, 'r') as f: 
    data = minidom.parse(f) 

あなたが本当にあなたは多分、少し周り混乱する必要があるかもしれませんタグが必要な場合:

data = minidom.parse(itertools.chain('<root>', f, '</root>') 
+0

'with'ステートメントの外側で' itertools.chain'を使うと私は同じ_ExpatErrorを与えられました:xxxの後ろにある間違い...そして 'with'ステートメントの中で私はエラーを受け取ります_AttributeError: 'itertools.chain'オブジェクトには属性 'read'_がありません 私は最初です再度正確でないXMLルート要素がデータ自体で繰り返されているためですが、属性エラーは? – HelloToEarth

+0

のために発生します。構文解析には 'file'オブジェクトが必要です(読み込みメソッドがあります)。それは文字列を返しますが、明らかに解析が望むものではありませんs。 XMLはうまく構成されていますか?おそらく 'BeautifulSoup'パッケージを解析してみてください。 –

+0

こちら(質問)[https://stackoverflow.com/questions/45395811/parsing-xml-with-beautiful-soup]をご覧ください。それはあなたの質問の複製です。 –

関連する問題