2016-05-02 9 views
1

最近Pythonを使用していて、特定のxmlファイルから情報を抽出したいのですが、問題は、このような形式で情報が実際にひどく保存されていることです。Pythonでxmlコメントを正しく解析するには

<Content> 
    <tags> 
    .... 
    </tags> 
<![CDATA["string1"; "string2"; .... 
]]> 
</Content> 

約20,000行であるため、ここにデータ全体を掲載することはできません。 は、私はちょうど[「文字列1」、「文字列2」、...]を含むリストを受け取るしたい、これは私がこれまで使用してきたコードです:私の出力はどれも

import xml.etree.ElementTree as ET 

tree = ET.parse(xmlfile) 
for node in tree.iter('Content'): 
    print (node.text) 

ではありませんが。どのように私はコメントのデータを受け取ることができますか? (再び、私はPythonを使用しています)

+0

ただ一つの行が必要な場合は、ファイルを開いてstring/regex関数で行を探してみてください。 – trans1st0r

+0

も参照してください。http://stackoverflow.com/questions/541100/finding-top-level-xml-comments-using-pythons-elementtree – trans1st0r

+0

リストの要素として約20000行があると言ったように、1行ではありません。 。 – WodkaRHR

答えて

1

あなたが代わりにDOMベースのパーサーのSAXベースのパーサーを作成したいと思います。特にあなたのものと同じ大きさの文書がある。

サックスベースのパーサーでは、データの格納方法に独自の制御ロジックを記述する必要があります。単純にDOMにロードするよりも複雑ですが、一度にドキュメント全体ではなく行単位でロードする方がはるかに高速です。それは、あなたのような嫌な事件をコメントで扱うことができるという利点があります。

ハンドラをビルドするときには、おそらくパーサーでLexicalHandlerを使用してコメントを引き出すことが必要になります。

ビルド方法の実例をお伝えしたいと思いますが、自分で作ってから長い時間が経ちました。サックスベースのパーサをオンラインで構築する方法については、たくさんのガイドがあり、そのディスカッションを別のスレッドに延期する予定です。

1

あなたのコメントは標準ではないようです。このような標準的なコメントは<!--Comment here-->です。

とコメントのこれらの種類は、例えばBeautifulsoupで解析することができます。

from bs4 import BeautifulSoup, Comment 

xml = """<Content> 
    <tags> 
    ... 
    </tags> 
<!--[CDATA["string1"; "string2"; ....]]--> 
</Content>""" 
soup = BeautifulSoup(xml) 
comments = soup.findAll(text=lambda text:isinstance(text, Comment)) 
print(comments) 

これは、必要な文字列にさらに解析しやすい可能性がどこから['[CDATA["string1"; "string2"; ....]]']を返します。

import re 
xml = """<Content> 
    <tags> 
    asd 
    </tags> 
<![CDATA["string1"; "string2"; ....]]> 
</Content>""" 
for i in re.findall("<!.+>",xml): 
    for j in re.findall('\".+\"', i): 
     print(j) 

これが返されます:あなたは非標準のコメントがある場合

、私のような正規表現をお勧めします"string1"; "string2"

関連する問題