2017-08-29 4 views
1

lxmlを使用して16MBのhtmlファイルを解析しようとしています。私の実際の仕事は、docnoタグの値が私の文書リストと一致すれば、すべての文書タグと各文書タグを取得することです。私はdocタグの内容を抽出します。lxml htmlパーサーが完全なファイルを解析しないのはなぜですか?

self.doc_file_listは、解析する必要があるそのような16Mbファイルのパスを含むリストです。 fileはファイルの絶対パスです。

これは、私は現在、

for file in file(self.doc_file_list,'r'): 
    tree = etree.parse(file.strip(), parser) 
    doc = tree.findall('.//doc') 
    for elem in doc: 
     docno = elem.find('.//docno').text 
     if docno in self.doc_set: 
      print >> out, etree.tostring(elem) 

私はetree.tostring(木)を使用して、ツリーの内容をチェックし、それは完全なファイルを解析し、唯一の実際のファイルのいくつかのキロバイトを解析していない使用していたコードです。

注:エラーメッセージは表示されませんが、ツリーの解析された内容が不完全なので、リスト全体を取得できません。

+0

実際に編集で多くクリアされました。さて、問題がどこにあるのかを実際のサンプルファイルで確認すると助かります。または、交互に、解析を中止する場所を見つけて、問題があるかどうかを自分で判断してください。停止する前後の情報を削除するときに問題が解決するかどうかを確認します。最終的には、特定の問題のある構造に絞り込むことができます。 – spectras

+0

...実際にはファイルサイズが問題であることが分かっている場合(小さなシステムの場合、libxmlで16MBのファイルを読み込むと通常〜100MBを読み込みます)、おそらくXmlTextReader APIを代わりに使用します。 – spectras

答えて

0

私はこの問題を最終的に解決することができました。生成されたツリーをチェックし、ドキュメント全体を解析していませんでした。これは、文書が大きく壊れていたためです。リンク上でこの情報を確認することができます:lxml.de/parsing.html(stackoverflowは2つ以上のリンクを追加できませんでしたので、httpを削除しました)。
この壊れたhtmlドキュメントの問題は、次の2つの方法のいずれかを使用して解決できます。
1. htmlパーサーを使用する代わりに、lxmlで提供されるElementSoupを使用できます。 BeautifulSoupパーサーを使用して、壊れたhtmlドキュメントを処理します。リンク:http://lxml.de/lxmlhtml.html
注:このアプローチは私にとってはうまくいかなかった。
2.別のアプローチでは、直接BeautifulSoupを直接使用し、それによって提供されるパーサを使用します。多くのパーサーオプションが用意されていて、どのパーツが最適かを調べる必要があります。私にとって、html.parserは機能しました。 リンク:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#attributes


ありがとうございました。

関連する問題