2016-08-07 89 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,介意接受我的回答;)? –