私は外部XMLファイルを解析するコードに取り組んできました。これらのファイルのいくつかは巨大で、最大ギガバイトのデータです。言うまでもなく、これらのファイルをメモリにロードするのは非常に非効率的であり、OutOfMemoryの問題を引き起こすことが多いため、これらのファイルをストリームとして解析する必要があります。
私はライブラリminiDOM、ElementTree、cElementTreeを使用しており、現在lxmlを使用しています。現在、を使用して、動作する、かなりメモリ効率の高いスクリプトがありlxml.etree.iterparse
ます。問題は、解析する必要のあるXMLファイルの一部にエンコードエラーが含まれていることです(UTF-8としてアドバタイズされますが、エンコードが異なる文字が含まれています)。これを使用する場合、カスタムパーサーのオプションをlxml.etree.parse
使用して修正できますが、カスタムパーサーは受け入れません。(参照:この質問)recover=True
iterparse
私の現在のコードは次のようになります。
from lxml import etree
events = ("start", "end")
context = etree.iterparse(xmlfile, events=events)
event, root_element = context.next() # <items>
for action, element in context:
if action == 'end' and element.tag == 'item':
# <parse>
root_element.clear()
iterparse
悪い文字(この場合は)に遭遇したときのエラー^Y
:
lxml.etree.XMLSyntaxError: Input is not proper UTF-8, indicate encoding !
Bytes: 0x19 0x73 0x20 0x65, line 949490, column 25
このデータをデコードしたくはありません。ドロップするだけです。ただし、要素をスキップする方法がわかりません。try /exceptステートメントを試してみましたcontext.next
。continue
どんな助けでもいただければ幸いです!
アップデート
いくつかの追加情報:これは、iterparseが失敗する行です:
<description><![CDATA:[musea de la photographie fonds mercator. Met meer dan 80.000 foto^Ys en 3 miljoen negatieven is het Muse de la...]]></description>
etreeによると、エラーはバイトで発生します0x19 0x73 0x20 0x65
。
hexeditによると、19 73 20 65
ASCIIに変換されます.s e
。.
この場所にはアポストロフィ(写真)が必要です。
私はまた、解決策を提供しないこの質問を見つけました。