2016-08-07 11 views
0

ここでは、Beautifulsoupオブジェクトを初期化するさまざまな方法を見てきました。私が見る限り、string = urlを渡すことも、オブジェクトを渡すこともできます。Beautifulsoupコンストラクタとその引数

url="https://somesite.com" 
url_html="<html><body><h1>Some header</h1><p>asdas</p></body></html>" 
soup1=BeautifulSoup(url_html, "html.parser") #1st way 
print(soup1.find("p").text) #can get the text "asdas" 

soup2=BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser") #2nd way 

soup3=BeautifulSoup(urllib.request.urlopen(url), "html.parser") #3rd way 

print(soup1.prettify()) 
print(soup2.prettify()) 
print(soup3.prettify()) 

しかし、何がスープを初期化する最後の二つの方法の内部で起こる:例えば、それはurllibを使用するのが一般的ですか?私が見る限り、urllib.request.urlopen(url).read()は純粋なhtml文字列url_htmlと同じものです。しかし、スープ3はどうですか? BeautifulSoupのコンストラクタで文字列が必要で、urlopen()によって返されたオブジェクトにtoStringメソッドがあるため、このメソッドは機能しますか?オブジェクトは文字列に変換され、実際には3番目のメソッドは2番目のメソッドと同じですか?

BeautifulSoupを初期化する他の方法はありますか?どちらが望ましいですか?

答えて

2

urlopen()は、開いたファイルのようなオブジェクトを返します。 Beautifulsoupのコンストラクタは、ファイルや文字列があるかどうかを調べるためにタイプチェックを使用します(正確にはmarkup.hasattr("read")です)。

これはPythonの一般的なパターンです大量のユーザー提供のテキストデータを扱うライブラリ

スープの大文字と小文字の違いは存在しません。他のライブラリは、ファイルオブジェクトをインテリジェントにすることができます。 。

+0

ありがとうございました。確かに、これはクミのソースページで見つけました。 'hasattr(マークアップ、 '読み取り'):#ファイルタイプのオブジェクトです。 ' 'markup = markup.read()' 'self.markup =マークアップ' – parsecer

+0

@parsecer、私の答えを受け入れる気になります;)? –

関連する問題