一、BeautifulSoup是什么?
1. 使用BeautifulSoup可以解析和提取網(wǎng)頁(yè)中的數(shù)據(jù)愚墓。
1)解析數(shù)據(jù):我們平時(shí)使用瀏覽器上網(wǎng)雀彼,瀏覽器會(huì)把服務(wù)器返回來的HTML源代碼翻譯為我們能看懂的樣子,之后我們才能在網(wǎng)頁(yè)上做各種操作瘸彤。而在爬蟲中修然,也要使用能讀懂html的工具,才能提取到想要的數(shù)據(jù)质况。這就是解析數(shù)據(jù)愕宋。
2)提取數(shù)據(jù):是指把我們需要的數(shù)據(jù)從眾多數(shù)據(jù)中挑選出來。
2.安裝BeautifulSoup:
BeautifulSoup不是Python標(biāo)準(zhǔn)庫(kù)结榄,需要單獨(dú)安裝它中贝。你需要在終端單擊開始-運(yùn)行-輸入cmd- 輸入一行代碼:pip install BeautifulSoup4。(Mac電腦需要輸入pip3 install BeautifulSoup4)
二臼朗、BeautifulSoup怎么用邻寿?
1.用BeautifulSoup解析數(shù)據(jù)
?bs對(duì)象= BeautifulSoup( 要解析的文本,‘解析器’)
要解析的文本必須是字符串视哑,我們要用的是一個(gè)Python內(nèi)置庫(kù):html.parser绣否。(它不是唯一的解析器,但是比較簡(jiǎn)單的)
1)根據(jù)之前所學(xué)的requests.get()挡毅,我們可以先獲取到一個(gè)Response對(duì)象蒜撮,并確認(rèn)自己獲取成功:
import requests#調(diào)用requests庫(kù)
res=requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')#獲取網(wǎng)頁(yè)源代碼,得到的res是response對(duì)象
print(res.status_code)#檢查請(qǐng)求是否正確響應(yīng)
html=res.text#把res的內(nèi)容以字符串的形式返回
print(html)#打印html
2)接下來就輪到BeautifulSoup登場(chǎng)解析數(shù)據(jù)了,請(qǐng)?zhí)貏e留意第2行和第6行新增的代碼:
import requests
from bs4 import BeautifulSoup#引入BS庫(kù)res=requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
html=res.text
soup=BeautifulSoup(html,'html.parser')#把網(wǎng)頁(yè)解析為BeautifulSoup對(duì)象
3)雖然response.text和soup打印出的內(nèi)容表面上看長(zhǎng)得一模一樣段磨,卻有著不同的內(nèi)心取逾,它們屬于不同的類:<class 'str'>?與<class 'bs4.BeautifulSoup'>。前者是字符串苹支,后者是已經(jīng)被解析過的BeautifulSoup對(duì)象砾隅。之所以打印出來的是一樣的文本,是因?yàn)锽eautifulSoup對(duì)象在直接打印它的時(shí)候會(huì)調(diào)用該對(duì)象內(nèi)的str方法债蜜,所以直接打印 bs 對(duì)象顯示字符串是str的返回結(jié)果晴埂。
我們之后還會(huì)用BeautifulSoup庫(kù)來提取數(shù)據(jù),如果這不是一個(gè)BeautifulSoup對(duì)象策幼,我們是沒法調(diào)用相關(guān)的屬性和方法的邑时。
用BeautiflSoup解析數(shù)據(jù)就是這關(guān)鍵的兩行代碼:
from bs4 import BeautifulSoup?
soup=BeautifulSoup(字符串,'html.parser')
2. 用BeautifulSoup提取數(shù)據(jù)
1)find():只提取首個(gè)滿足要求的數(shù)據(jù)。
2)find_all():提取出的是所有滿足要求的數(shù)據(jù)特姐。
括號(hào)中的參數(shù):標(biāo)簽和屬性可以任選其一晶丘,也可以兩個(gè)一起使用,這取決于我們要在網(wǎng)頁(yè)中提取的內(nèi)容唐含。
3)通過標(biāo)簽提惹掣 :
import requests
from bs4 import BeautifulSoup
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html'
res = requests.get (url)
print(res.status_code)
soup = BeautifulSoup(res.text,'html.parser')
item = soup.find('div') #使用find()方法提取首個(gè)<div>元素,并放到變量item里捷枯。
print(type(item)) #打印item的數(shù)據(jù)類型
print(item)? ? ? #打印item
4)?通過屬性提裙鲋取:
import requests # 調(diào)用requests庫(kù)
from bs4 import BeautifulSoup # 調(diào)用BeautifulSoup庫(kù)
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')# 返回一個(gè)Response對(duì)象,賦值給res
html = res.text# 把Response對(duì)象的內(nèi)容以字符串的形式返回
soup = BeautifulSoup( html,'html.parser') # 把網(wǎng)頁(yè)解析為BeautifulSoup對(duì)象
items = soup.find_all(class_='books') # 通過匹配標(biāo)簽和屬性提取我們想要的數(shù)據(jù)
print(items) # 打印items
print(type(items)) #打印items的數(shù)據(jù)類型
# 數(shù)據(jù)類型是<class 'bs4.element.ResultSet>淮捆, 前面說過可以把它當(dāng)做列表list來看待郁油。
#列表并不是我們最終想要的東西,我們想要的是列表中的值攀痊,所以要想辦法提取出列表中的每一個(gè)值桐腌。
#用for循環(huán)遍歷列表,就可以把這三個(gè)<div>元素取出來了苟径。
for item in items:
? ? print('想找的數(shù)據(jù)都包含在這里了:\n',item) # 打印item
我們一般會(huì)選擇用type()函數(shù)查看一下數(shù)據(jù)類型案站,因?yàn)镻ython是一門面向?qū)ο缶幊痰恼Z(yǔ)言,只有知道是什么對(duì)象棘街,才能調(diào)用相關(guān)的對(duì)象屬性和方法蟆盐。
? ? print(type(item))
我們看到它們的數(shù)據(jù)類型是<class 'bs4.element.Tag'>,是Tag對(duì)象遭殉,不知道你是否還記得石挂,這與find()提取出的數(shù)據(jù)類型是一樣的。
3) Tag類對(duì)象的常用屬性和方法:
import requests# 調(diào)用requests庫(kù)
from bs4 import BeautifulSoup# 調(diào)用BeautifulSoup庫(kù)
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')# 返回一個(gè)response對(duì)象险污,賦值給reshtml=res.text# 把res解析為字符串
html = res.text# 把Response對(duì)象的內(nèi)容以字符串的形式返回
soup = BeautifulSoup(html,'html.parser')# 把網(wǎng)頁(yè)解析為BeautifulSoup對(duì)象
items = soup.find_all(class_='books')# 通過匹配屬性class='books'提取出我們想要的元素
for item in items:# 遍歷列表
itemsfind = item.find('h2')# 在列表中的每個(gè)元素里誊稚,匹配標(biāo)簽<h2>提取出數(shù)據(jù)
title = item.find(class_='title')# 在列表中的每個(gè)元素里,匹配屬性class_='title'提取出數(shù)據(jù)
brief = item.find(class_='info')# 在列表中的每個(gè)元素里,匹配屬性class_='info'提取出數(shù)據(jù)
print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text)# 打印書籍的類型里伯、名字、鏈接和簡(jiǎn)介的文字
運(yùn)行以上代碼渤闷,我們就可以完成解析數(shù)據(jù)和提取數(shù)據(jù)的工作了疾瓮。
每個(gè)網(wǎng)頁(yè)都有自己的結(jié)構(gòu),我們寫爬蟲程序飒箭,還是得堅(jiān)持從實(shí)際出發(fā)狼电,具體問題具體分析。
三弦蹂、操作對(duì)象的轉(zhuǎn)換過程
1.?從最開始用requests庫(kù)獲取數(shù)據(jù)肩碟,到用BeautifulSoup庫(kù)來解析數(shù)據(jù),再繼續(xù)用BeautifulSoup庫(kù)提取數(shù)據(jù)凸椿,不斷經(jīng)歷的是我們操作對(duì)象的類型轉(zhuǎn)換削祈。如圖:
我們的操作對(duì)象從URL鏈接到了Response對(duì)象。
然后沿這條路:Response對(duì)象——字符串——BS對(duì)象脑漫。
后來又產(chǎn)生了兩條分岔:一條是BS對(duì)象——Tag對(duì)象髓抑;另一條是BS對(duì)象——列表——Tag對(duì)象。
2.?在BeautifulSoup中优幸,不止find()和find_all()吨拍,還有select()也可以達(dá)到相同目的。