第3課 BeautifulSoup是什么

一、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á)到相同目的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末网杆,一起剝皮案震驚了整個(gè)濱河市羹饰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碳却,老刑警劉巖队秩,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異追城,居然都是意外死亡刹碾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門座柱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迷帜,“玉大人,你說我怎么就攤上這事色洞∠非拢” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵火诸,是天一觀的道長(zhǎng)锦针。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么奈搜? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任悉盆,我火速辦了婚禮,結(jié)果婚禮上馋吗,老公的妹妹穿的比我還像新娘焕盟。我一直安慰自己,他們只是感情好宏粤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布脚翘。 她就那樣靜靜地躺著,像睡著了一般绍哎。 火紅的嫁衣襯著肌膚如雪来农。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天崇堰,我揣著相機(jī)與錄音沃于,去河邊找鬼。 笑死赶袄,一個(gè)胖子當(dāng)著我的面吹牛揽涮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饿肺,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蒋困,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了敬辣?” 一聲冷哼從身側(cè)響起雪标,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溉跃,沒想到半個(gè)月后村刨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撰茎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嵌牺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龄糊。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逆粹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炫惩,到底是詐尸還是另有隱情僻弹,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布他嚷,位于F島的核電站蹋绽,受9級(jí)特大地震影響芭毙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卸耘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一退敦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹊奖,春花似錦苛聘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唱捣。三九已至两蟀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間震缭,已是汗流浹背赂毯。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拣宰,地道東北人党涕。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巡社,于是被迫代替她去往敵國(guó)和親膛堤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Python爬蟲入門(urllib+Beautifulsoup) 本文包括:1晌该、爬蟲簡(jiǎn)單介紹2肥荔、爬蟲架構(gòu)三大模塊3...
    廖少少閱讀 9,835評(píng)論 0 6
  • beautifulsoup和 lxml 一樣,Beautiful Soup 也是一個(gè)HTML/XML的解析器朝群,主要...
    小袋鼠cf閱讀 1,706評(píng)論 0 0
  • Beautiful Soup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫(kù).它能夠通過你喜歡的轉(zhuǎn)換器實(shí)...
    LitOrange閱讀 5,279評(píng)論 0 4
  • Beautiful Soup是python的一個(gè)HTML或XML的解析庫(kù)燕耿,我們可以用它來方便的從網(wǎng)頁(yè)中提取數(shù)據(jù),它...
    墨攻灬閱讀 630評(píng)論 0 0
  • 今天下午姜胖,我和弟弟吃完飯誉帅,媽媽看手機(jī)上還有弟弟的作業(yè),就讓他做右莱。媽媽讓我再旁邊看著蚜锨,一有錯(cuò)題就讓他改正。語(yǔ)文都是些...
    書中漫步的冉閱讀 163評(píng)論 0 0