學(xué)會(huì)BS4,輕松解決數(shù)據(jù)提取!

大家好,我是小瑜!

今天來(lái)給大家介紹用BeautifulSoup4來(lái)對(duì)數(shù)據(jù)進(jìn)行解析和提取的方法。

前言

當(dāng)我們給服務(wù)器發(fā)送請(qǐng)求獲取響應(yīng)之后,接下來(lái)我們就需要從響應(yīng)的字符串中解析和提取需要的數(shù)據(jù)信息。

接下來(lái)我將給大家介紹用BeautifulSoup4來(lái)對(duì)數(shù)據(jù)進(jìn)行提取的方式,供大家學(xué)習(xí)。

安裝

BeautifulSoup3目前已經(jīng)停止開(kāi)發(fā),推薦現(xiàn)在的項(xiàng)目使用BeautifulSoup4(BS4),更為方便的是,官網(wǎng)也提供了它的中文開(kāi)發(fā)說(shuō)明文檔。

安裝命令如下:

pip install BeautifulSoup4

安裝好后,就可以正常使用了!

解析數(shù)據(jù)

BeautifulSoup解析數(shù)據(jù)的用法非常簡(jiǎn)單,如圖:

在括號(hào)中,要輸入兩個(gè)參數(shù),第1個(gè)參數(shù)是要被解析的文本,注意了,它必須必須必須是字符串。括號(hào)中的第2個(gè)參數(shù)用來(lái)標(biāo)識(shí)解析器,解析器有如圖以下幾種類型(圖片來(lái)源網(wǎng)絡(luò)):

我建議用的是Python內(nèi)置庫(kù):html.parser。因?yàn)樗鞘褂梅绞阶詈?jiǎn)單的,什么基礎(chǔ)的人群都適合。

提取數(shù)據(jù)

我們?nèi)匀皇褂肂eautifulSoup來(lái)提取數(shù)據(jù)。這一步,又可以分為兩部分知識(shí):find()與find_all(),以及Tag對(duì)象(標(biāo)簽對(duì)象)。

1. find()與find_all()

find()與find_all()是BeautifulSoup對(duì)象的兩個(gè)方法,它們可以匹配html的標(biāo)簽和屬性,把BeautifulSoup對(duì)象里符合要求的數(shù)據(jù)都提取出來(lái)。

它倆的用法是一樣的,區(qū)別在于它們提取的數(shù)據(jù)數(shù)量。

find()只提取首個(gè)滿足要求的數(shù)據(jù)。find()方法將代碼從上往下找,找到符合條件的第一個(gè)數(shù)據(jù),不管后面還有沒(méi)有滿足條件的其他數(shù)據(jù),停止尋找,立即返回。

而find_all()提取出的是所有滿足要求的數(shù)據(jù)。代碼從上往下找,一直到文檔的最后,把所有符合條件的數(shù)據(jù)揣好,一起打包返回。

兩者用法圖:

2. Tag對(duì)象

我們現(xiàn)在提取出來(lái)的數(shù)據(jù)還不是目標(biāo)數(shù)據(jù),里面含著HTML標(biāo)簽,所以下面,我們要進(jìn)入到提取數(shù)據(jù)中的另一個(gè)知識(shí)點(diǎn)——Tag對(duì)象。

當(dāng)我們用type()查看我們提取出來(lái)的數(shù)據(jù)類型發(fā)現(xiàn),我們提取出來(lái)的數(shù)據(jù)類型是<class 'bs4.element.Tag'>,是Tag對(duì)象。

接下來(lái)我們看看Tag類對(duì)象的常用屬性和方法了。

首先,Tag對(duì)象可以使用find()與find_all()來(lái)繼續(xù)檢索。這樣使得我們可以分級(jí)一步一步來(lái)進(jìn)行對(duì)數(shù)據(jù)的提取。

然后,就是把Tag對(duì)象中的文本提取出來(lái)。就是用到上面的Tag.text和Tag['屬性名']兩種屬性/方法來(lái)提取出來(lái)目標(biāo)數(shù)據(jù)。

完成這一步之后,我們就成功解析、提取到了所有的數(shù)據(jù)。

實(shí)操運(yùn)用

我們通過(guò)爬取網(wǎng)上書(shū)店Books to Scrape的Travel類書(shū)籍的書(shū)名、評(píng)分、價(jià)格三種信息,來(lái)鞏固今天的知識(shí)。

1. 頁(yè)面分析

我們通過(guò)對(duì)該網(wǎng)頁(yè)的頁(yè)面進(jìn)行分析發(fā)現(xiàn),它是一個(gè)靜態(tài)存儲(chǔ)的網(wǎng)頁(yè),所有的數(shù)據(jù)都存儲(chǔ)在源網(wǎng)頁(yè)標(biāo)簽中。

這樣就可以使用BeautifulSoup來(lái)對(duì)數(shù)據(jù)進(jìn)行提取。

2. 提取數(shù)據(jù)

soup = BeautifulSoup(html,'html.parser')

items = soup.find_all('article')

foriteminitems:

a = item.find('h3').find('a')['title']

b = item.find('p')['class'][1]

c = item.find(class_="price_color").text

ulist.append([a,b,c])

3. 數(shù)據(jù)存儲(chǔ)

還是看這篇文章就夠了!一文教會(huì)你,Python數(shù)據(jù)如何儲(chǔ)存

總結(jié)

1. 本文詳細(xì)介紹了用BeautifulSoup來(lái)進(jìn)行對(duì)響應(yīng)數(shù)據(jù)的解析和處理,內(nèi)容較多,請(qǐng)讀者仔細(xì)閱讀。

2. 當(dāng)解析和提取class標(biāo)簽的屬性時(shí),需要寫(xiě)成class_=,直接書(shū)寫(xiě)class=,程序會(huì)報(bào)錯(cuò),避免與python語(yǔ)法中的類 class發(fā)生沖突。

3. 當(dāng)提取數(shù)據(jù)的屬性中有空格時(shí)需要將空格換成.來(lái)代替,否則將無(wú)法解析和提取出該標(biāo)簽中的數(shù)據(jù)。

4. 后臺(tái)私信我發(fā)送[Bs4]即可獲得項(xiàng)目源碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容