2016-08-07 88 views
0

我在這裏看到了很多方法來初始化Beautifulsoup對象。據我所見,你可以傳遞一個string = url或傳遞一些對象。例如,它的共同使用urllibBeautifulsoup構造函數及其參數

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.request.urlopen(url).read()和純html字符串url_html是一樣的。但湯3呢? 它是否工作,因爲BeautifulSoup的構造函數需要一個字符串,並且在由urlopen()返回的對象中存在toString方法?而對象被轉換成字符串,實際上第三種方法與第二種方法相同?

是否有任何其他方式來初始化BeautifulSoup?哪個更好?

回答

2

urlopen()返回一個打開的文件狀對象。 Beautifulsoup的構造函數使用類型檢查來查看它是否有文件或字符串(準確地說,它的確如此,在第一種情況下,它只是調用它的read()方法。庫處理大量的用戶提供的文本數據

湯的情況的差異是不存在的其他圖書館可能會做一些更聰明的文件對象,例如分區它,而不是加載到內存en bloque

+0

謝謝!事實上,在crummy的源代碼頁上發現了這個: '如果hasattr(標記,'讀''):#它是一個文件類型的對象。「# 'markup = markup.read()' 'self.markup = markup' – parsecer

+0

@parsecer,介意接受我的回答;)? –