2011-07-29 7 views
4

私はいくつかのランダムなHTMLを持っており、それを解析するためにBeautifulSoupを使用しましたが、ほとんどの場合(> 70%)、それは窒息します。私はBeautiful soup 3.0.8と3.2.0を使ってみましたが(3.1.0以上の問題がありました)、結果はほぼ同じです。Pythonで最も寛容なHTMLパーサーは何ですか?

私は私の頭の上から、Pythonで利用可能ないくつかのHTMLパーサのオプションを呼び出すことができます:私はこれらのすべてをテストするつもり

  • BeautifulSoup
  • lxmlの
  • pyquery

、あなたのテストでどちらが一番寛容であるのかを知りたかったので、悪いHTMLを解析しようとすることさえできました。

+2

これは本当に答えではないので、私はそのように投稿しているわけではありませんが、正確な理由は美しいスープが開発された理由です:悪いHTMLを解析する。あなたが美しいスープがそれを解析することすらできない、ひどく不正な形式の文書を持っているなら、あなたは運が悪いかもしれません。私が聞いたことがある他のパーザ(lxmlを含む)ははるかに厳密です。 –

+0

も参照してください。http://stackoverflow.com/questions/1922032/parsing-html-in-python-lxml-or-beautifulsoup-which-of-the-is-better-for-what –

+2

この目的を維持するために、それぞれのパーサーがbarfsする最小スニペットを投稿すると便利です。 – smci

答えて

1

私は、解析のためにhtml5libでBeautifulSoup 4.0を使い終わってしまいましたが、私のコードにいくつかの変更を加えると、現在はうまくいきます。

1

beautifulsoupでhtmlの問題が修正されない場合、次善策は正規表現です。 lxml、elementtree、minidomは解析に非常に厳格であり、実際には正しく機能しています。

その他のヒント:

  1. 私は、コマンドプロンプトを通じてオオヤマネコのブラウザにHTMLを送り、ページ/コンテンツのテキストバージョンを取り出し、正規表現を使用して解析します。

  2. htmlからtextまたはhtmlに変換すると、すべてのhtmlタグが削除され、テキストが残ってしまいます。それは解析が簡単です。

+0

のラッパーですが、私はhtmlを変更する必要があるので、私の場合は良い解決策ではありません。 –

3

これらはすべてです。私はまだ、lxml.htmlが解析できなかった野生のhtmlページに出くわしました。あなたが解析しようとしているページのlxml barfsが、lxmlを幸せにするためにいくつかの正規表現を使っていつも前処理することができます。

lxml自体はかなり厳密ですが、lxml.htmlは別のパーサーであり、非常に壊れたhtmlを扱うことができます。非常に壊れたhtmlの場合、lxmlにはが付属しており、BeautifulSoupライブラリとインターフェースしています。

lxml.htmlを使用して壊れたHTMLを解析するために、いくつかのアプローチがここで説明されている:私は成功を収めてきた何か(ネストされた<form>要素を含むものが頭に浮かぶ)で動作しないページでhttp://lxml.de/elementsoup.html

関連する問題