web-dev-qa-db-ja.com

BeautifulSoupとlxml.html-何を好みますか?

私はHTMLの解析を含むプロジェクトに取り組んでいます。

周りを検索した後、私は2つのありそうなオプションを見つけました:BeautifulSoupとlxml.html

どちらか一方を優先する理由はありますか?私はしばらくXMLにlxmlを使用しており、より快適になると思いますが、BeautifulSoupが一般的であるようです。

自分に合ったものを使うべきだと思いますが、私は両方での個人的な経験を探していました。

33
user225312

簡単な答えは、imoです。ソースが整形式であると信頼できる場合は、lxmlソリューションを使用してください。それ以外の場合は、BeautifulSoupを使用します。

編集:

この回答は3年前のものです。ジョナサンヴァナスコがコメントで行っているように、BeautifulSoup4lxmlの内部パーサーとしての使用をサポートするようになったため、必要に応じて、パフォーマンスにほとんど影響を与えることなく、BeautifulSoupの高度な機能とインターフェースを使用できます(ただし、lxml私自身-多分それは習慣の力です:))。

35
simon

要約すると、lxmlは超高速のプロダクション品質のhtmlおよびxmlパーサーとして位置付けられ、ちなみに、BeautifulSoupの機能にフォールバックするsoupparserモジュールも含まれています。 BeautifulSoupは1人のプロジェクトであり、形式の悪いhtmlまたはxmlからデータをすばやく抽出する時間を節約するように設計されています。

lxml documentation は、両方のパーサーに長所と短所があることを示しています。このため、lxmlにはsoupparserが用意されているため、切り替えが可能です。引用

BeautifulSoupは別の解析手法を使用します。これは実際のHTMLパーサーではありませんが、正規表現を使用してタグスープを調べます。したがって、それはある場合にはより寛容であり、他の場合にはあまり良くありません。 lxml/libxml2が壊れたHTMLをより適切に解析および修正することは珍しくありませんが、BeautifulSoupはエンコーディング検出を優れた方法でサポートしています。 これは、パーサーがよりうまく機能する入力に大きく依存します。

結局、彼らは言っている、

このパーサーを使用することの欠点は、lxmlのHTMLパーサーよりも非常に遅いことです。 したがって、パフォーマンスが重要な場合は、特定の場合のフォールバックとしてのみsoupparserを使用することを検討してください。

私がそれらを正しく理解している場合、それはスープパーサーがより堅牢であることを意味します---正規表現を使用して不正なタグの「スープ」を処理できます--- lxmlはより単純で、物事を解析するだけです期待どおりにツリーを構築します。 BeautifulSoupsoupparserだけでなく、lxml自体にも適用されると思います。

また、BeautifulSoupを使用してすばやく解析しながら、lxmlのエンコーディング検出のメリットを活用する方法も示しています。

>>> from BeautifulSoup import UnicodeDammit

>>> def decode_html(html_string):
...     converted = UnicodeDammit(html_string, isHTML=True)
...     if not converted.unicode:
...         raise UnicodeDecodeError(
...             "Failed to detect encoding, tried [%s]",
...             ', '.join(converted.triedEncodings))
...     # print converted.originalEncoding
...     return converted.unicode

>>> root = lxml.html.fromstring(decode_html(tag_soup))

(同じソース: http://lxml.de/elementsoup.html )。

BeautifulSoupの作成者の言葉では、

それでおしまい!楽しんで!みんなの時間を節約するためにBeautiful Soupを書きました。慣れれば、デザインが不十分なWebサイトから数分でデータを抽出できるはずです。コメントがあったり、問題が発生したり、Beautiful Soupを使用するプロジェクトについて知りたい場合は、私にメールを送ってください。

 --Leonard

Beautiful Soupのドキュメント から引用。

これが明確になったことを願っています。スープは、デザインが不十分なWebサイトからデータを抽出する時間を節約できるように設計された、見事な1人のプロジェクトです。目標は、今すぐ時間を節約し、仕事を終わらせることです。必ずしも長期的に時間を節約することではなく、ソフトウェアのパフォーマンスを最適化することも絶対にありません。

また、 lxmlウェブサイト から、

lxmlはPython Package Indexから200万回以上ダウンロードされており、LinuxやMacOS-Xなどの多くのパッケージディストリビューションで直接入手することもできます。

そして、 なぜlxmlなのか から、

Cライブラリlibxml2とlibxsltには、次のような大きな利点があります。..標準に準拠しています...全機能を備えています...高速です。速い!速い! ... lxmlは、新しいPython libxml2およびlibxsltのバインディングです...

16
osa

両方を使う? DOM操作用のlxml、解析用のBeautifulSoup:

http://lxml.de/elementsoup.html

2
ymv

lxmlは素晴らしい。ただし、入力をhtmlとして解析することは、dom構造が実際に探しているものを見つけるのに役立つ場合にのみ役立ちます。

通常の文字列関数または正規表現を使用できますか?多くのhtml解析タスクでは、入力をhtmlドキュメントではなく文字列として扱う方が、直感的にははるかに簡単です。

0
dfichter