一.BeautifulSoup是一個(gè)類紊册,用來處理html文件有很多方法钮莲,實(shí)例化需要傳入兩個(gè)參數(shù)葡公,一個(gè)是html文件饺鹃,一個(gè)是'html.parser'
#使用BeautifulSoup
from bs4 import BeautifulSoup
#一個(gè)例子
from urllib.request import urlopen
from bs4 import BeautifulSoup
url='http://www.baidu.com'
html=urlopen(url)
bsobj=BeautifulSoup(html.read(),'html.parser')#直接把html內(nèi)容轉(zhuǎn)換為了BeautifulSoup類莫秆,傳入html.read()參數(shù)间雀,實(shí)例化類
html_body=bsobj.body
#若body中有h1標(biāo)簽
html_h1=bsobj.body.h1
二.BeautifulSoup的find()以及findAll()方法
(1)find與findAll
?-findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
返回的是<class 'bs4.element.ResultSet'>不能進(jìn)行樹形結(jié)構(gòu)操作
-find(self, name=None, attrs={}, recursive=True, text=None, **kwargs)
返回的還是<class 'bs4.element.Tag'>時(shí)BeautifulSoup的基類,結(jié)構(gòu)沒有破壞镊屎,可以進(jìn)行導(dǎo)航樹操作
可以查找該對象的子標(biāo)簽惹挟,后代標(biāo)簽,父標(biāo)簽杯道,兄弟標(biāo)簽匪煌。
其實(shí)find()是limit=1是findAll()
這兩個(gè)方法所有參數(shù)都是用默認(rèn)值參數(shù)創(chuàng)建的(最后keyword是用關(guān)鍵字參數(shù)的收集),所以可以沒有任何
1)tag:可以是一個(gè)標(biāo)簽党巾,也可以是標(biāo)簽字典
eg:obj.findAll({'h1','h2','h3'})
2)attributes:是字典萎庭,key是屬性,value是屬性值(多個(gè)值時(shí)用字典表示)
!!!!并且若只輸入一個(gè)參數(shù)時(shí)齿拂!要加attrs={}!!!,否則會(huì)賦值給name
eg:obj.findAll('span',{'class':{'green','red'}})
返回html文檔中紅色和綠色兩種顏色的span標(biāo)簽
3)text:用標(biāo)簽的文本內(nèi)容去匹配驳规,text的內(nèi)容也可以用正則表達(dá)式匹配模式進(jìn)行匹配,即text=re.compile('')
eg:obj.findAll(text='python')
會(huì)返回所以的包含python內(nèi)容的標(biāo)簽
注:常用就這3個(gè)參數(shù)
(2)導(dǎo)航樹
只有用find查找的結(jié)果才能進(jìn)行導(dǎo)航樹操作署海,因?yàn)樵冀Y(jié)構(gòu)還保留
eg:
from urllib.request import urlopen
from bs4 import BeautifulSoup
url='http://www.baidu.com'
html=urlopen(url)
bsobj=BeautifulSoup(html.read(),'html.parser')
nuomi=bsobj.find('a',text='糯米')
nuomi2=bsobj.findAll('a',text='糯米')
print(type(nuomi))
print(type(nuomi2))
print('產(chǎn)生一個(gè)兄弟標(biāo)簽生成器','\n')
for i in nuomi.next_siblings:#產(chǎn)生一個(gè)兄弟標(biāo)簽生成器(包含除自己之外的兄弟標(biāo)簽順序有頁面順序決定)
print(i)
print('\n'*2,'糯米的下一個(gè)兄弟標(biāo)簽')
print(nuomi.next_sibling)#下一個(gè)兄弟標(biāo)簽
print('\n','糯米的父標(biāo)簽')
print(nuomi.parent)#生產(chǎn)父標(biāo)簽
u1=bsobj.find('div',{'class':'head_wrapper'})
for i in u1.children:
print(i)
for i in u1.descendents:
print(i)
#會(huì)有很多結(jié)構(gòu)吗购,因?yàn)闀?huì)列出子標(biāo)簽的子標(biāo)簽。
三砸狞、獲得文本和屬性捻勉,lambda表達(dá)式
(1)獲得文本tag.getText()
eg:>>> nuomi.getText()
'糯米'
(2)獲得屬性tag.attrs
eg:>>> nuomi.attrs
{'href': 'http://www.nuomi.com/?cid=002540', 'name': 'tj_trnuomi', 'class': ['mnav']}
(3)在finAll函數(shù)中才能用lambda表達(dá)式:但是tag要作為lambda表達(dá)式的參數(shù)
eg:soup.findAll(lambda tag:len(tag.attrs)==2)