2015-01-06 15 views
15

私はウェブスクレイピングプロジェクトに取り組んでおり、スピードに問題がありました。それを修正しようとすると、html.parserの代わりにlxmlをBeautifulSoupのパーサとして使用したいと考えています。私はこれを行うことができました:lxmlをデフォルトとして設定BeautifulSoupパーサー

soup = bs4.BeautifulSoup(html, 'lxml') 

が、私は繰り返し、私はBeautifulSoupを呼び出すたびに'lxml'入力する必要がありますする必要はありません。プログラムの最初に一度使用するパーサーを設定する方法はありますか? Specifying the parser to useドキュメントページによると

+1

'lxml'は*あなたは' lxml'がインストールされていると仮定すると、* bs4' 'のデフォルトです。だからあなたがBeautifulSoup3で作業している場合を除いて... – roippi

+0

私はbs4を使用していますが、私が現在どのパーサーを使用しているかを確認する方法はわかりませんでした。ありがとうございました! –

答えて

12

BeautifulSoupのコンストラクタの最初の引数は文字列またはあなたが解析されたい オープンファイルハンドルマークアップです。 2番目の引数は、マークアップを解析する方法を とする方法です。

何も指定しないと、 という最高のHTMLパーサーがインストールされます。 Beautiful Soupはlxmlのパーサを最高のものとしてランク付けし、次に html5lib's、次にPythonの組み込みパーサをランク付けします。

つまり、lxmlを同じpython環境にインストールするだけで、デフォルトのパーサーになります。

ただし、パーサを明示的に記述することは、ベストプラクティスのアプローチと考えられます。 differences between parsersがあり、微妙なエラーが発生する可能性があります。BeautifulSoupが単独で最適なパーサーを選択すると、デバッグは困難になります。また、lxmlをインストールする必要があることを覚えておく必要があります。そして、もしそれがインストールされていなければ、気づかないかもしれません。BeautifulSoupは、エラーを投げずにただちに次の利用可能なパーサを取得します。

パーサを明示的に指定したくない場合は、プロジェクトのREADME/documentationに記述したコードを使用する人や、プロジェクト要件にlxmlを記載してください。と一緒にbeautifulsoup4

ほか:"Explicit is better than implicit."

+0

注意:bs4バージョン4.5。1、 'lxml'パーサーを指定していてbs4 **がインストールされていない場合**エラー: bs4.FeatureNotFound:要求された機能を持つツリービルダーが見つかりませんでした:lxml。パーサーライブラリをインストールする必要がありますか? – glexey

4

が明らかaccepted answer最初のを見てみましょう。それはかなり良いですし、この専門性のためとして:

が、私は繰り返し型「lxmlの」私は BeautifulSoupを呼び出すたびに持っている必要はありません。私のプログラムの初めに で一度使うパーサーを設定する方法はありますか?

私があなたの質問を正しく理解していれば、いくつかのキーストロークを節約する2つの方法が考えられます。 - ラッパー関数を定義する - 部分関数を作成する。

# V1 - define a wrapper function - most straight-forward. 
import bs4 

def bs_parse(html): 
    return bs4.BeautifulSoup(html, 'lxml') 
# ... 
html = ... 
bs_parse(html) 

それとも、披露のように感じる場合...

import bs4 
from functools import partial 
bs_parse = partial(bs4.BeautifulSoup, features='lxml') 
# ... 
html = ... 
bs_parse(html) 
+0

'partial'の仕組みに説明を追加できますか?ラッパー関数を使用する利点はありますか? – r3robertson

+1

@ r3robertsonここでは部分的な機能のための優れたドキュメントがあります:https://docs.python.org/2/library/functools.html#functools.partial 部分的にはボンネットの方が遅く複雑になっているようですラッパーと比較して、しかしそれが実装されると、それはむしろ使いやすいです。部分的な機能は、数学的観点からはより良い言葉の欠如のためにきれいです。他の言語にはこれがあり、一部の人が関数型プログラミングをうまく利用していると考えられていますが、速度と余分な読み込みの面で価格を払っています。彼らは楽しいので、私はまだ部分的な機能を使います。 – Leonid