陳海燕 朱慶華 常瑩
摘要:現(xiàn)在是信息時(shí)代,互聯(lián)網(wǎng)為我們提供了豐富的信息資源。只要我們有需要就能通過(guò)網(wǎng)絡(luò)得到。但是正因?yàn)榫W(wǎng)絡(luò)上的資源太豐富了,如果想得到需要的內(nèi)容,用戶就要做大量篩選和甄別工作。網(wǎng)絡(luò)信息篩選和抓取有很多方法,比如Java、Python等語(yǔ)言,還有一些專門(mén)的公司為用戶提供網(wǎng)絡(luò)爬蟲(chóng)程序做信息的定向抓取。目前使用較多的是Python語(yǔ)言,文章要研究的內(nèi)容是:通過(guò)使用Python庫(kù)中的Beautiful Soup庫(kù)快速、簡(jiǎn)捷地抓取所需信息。
關(guān)鍵詞:BeautifulSoup;Python;網(wǎng)絡(luò)爬蟲(chóng)
中圖分類號(hào):TP393? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)08-0195-02
1 BeautifulSoup介紹
Beautiful Soup是一個(gè)可以從網(wǎng)頁(yè)文件中提取信息的Python庫(kù),它包含在bs4庫(kù)里。需要注意的是下載、安裝bs4時(shí)需要聯(lián)網(wǎng),否則安裝會(huì)出錯(cuò),具體命令為:pip install bs4,如圖1所示。
2 解析HTML流程說(shuō)明
HTML文件是由一組尖括號(hào)構(gòu)成的標(biāo)簽組織起來(lái)的,每一對(duì)尖括號(hào)形式一個(gè)標(biāo)簽,標(biāo)簽之間存在上下關(guān)系,形成一顆標(biāo)簽樹(shù)。因此可以說(shuō)Beautiful Soup是解析、遍歷、維護(hù)“標(biāo)簽樹(shù)”的功能庫(kù)。眾所周知:html由眾多標(biāo)簽組成,如何精確定位標(biāo)簽,從標(biāo)簽中提取到需要的內(nèi)容呢?
在找到對(duì)應(yīng)標(biāo)簽位置后,熟悉html的人知道,信息一般會(huì)存儲(chǔ)在兩個(gè)位置中:
1)開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽中的內(nèi)容;
2) 開(kāi)始標(biāo)簽中的屬性值。
例如下面這行標(biāo)簽:
。這個(gè)標(biāo)簽的含義是:一個(gè)段落中有一個(gè)超級(jí)鏈接,鏈接的地址是:www.baidu.com。我們要做的就是提取和之間的“美食網(wǎng)”文字,或者提取標(biāo)簽的屬性值,即鏈接www.baidu.com內(nèi)容。
3 使用python進(jìn)行網(wǎng)頁(yè)內(nèi)容獲取的方法
3.1引入BeautifulSoup庫(kù)
程序開(kāi)始的第1行需要引入BeautifulSoup庫(kù)。如果bs4下出現(xiàn)波浪線表示安裝路徑有問(wèn)題,需要檢查。語(yǔ)句如圖2所示。
3.2 html代碼放入str
將html代碼放入一個(gè)變量中,注意,由于html代碼有換行,需要每一行都加上單引號(hào),這樣比較麻煩,可以把html整個(gè)代碼用三個(gè)單引號(hào)里引起來(lái),這樣就簡(jiǎn)單多了,而且也增強(qiáng)了代碼的可讀性。如下所示:
str = '''
這道菜俺從小吃到大,它是我兒時(shí)的全部味覺(jué)記憶。
美食網(wǎng)免責(zé)聲明。
'''
3.3使用lxml解析器實(shí)例化BeautifulSoup對(duì)象
BeautifulSoup支持Python標(biāo)準(zhǔn)庫(kù)中的HTML解析器(HTMLParser),還支持一些第三方的解析器,如果我們不安裝它,則 Python 會(huì)使用 Python默認(rèn)的解析器,lxml解析器更加強(qiáng)大,速度更快,推薦安裝使用。具體的語(yǔ)句如圖3所示。
3.4獲取title標(biāo)簽里的內(nèi)容
title標(biāo)簽的含義是為網(wǎng)頁(yè)定義標(biāo)題。需要說(shuō)明的是:如果要提取“標(biāo)題”,只需要使用title標(biāo)簽名來(lái)識(shí)別,因?yàn)檎麄€(gè)html文檔中,title標(biāo)簽只會(huì)出現(xiàn)一次。具體的語(yǔ)句如圖4所示。
3.5獲取p標(biāo)簽里的文字
P標(biāo)簽是段落標(biāo)簽,如果要提取p標(biāo)簽里的內(nèi)容,不能像提取title標(biāo)簽一樣只使用p標(biāo)簽,因?yàn)閜標(biāo)簽可以有多個(gè)。因此p標(biāo)簽要和它的class屬性聯(lián)合起來(lái)使用,例如3.2中給出的標(biāo)簽,用'first'或'second'來(lái)識(shí)別p標(biāo)簽。要提取class屬性是first的p標(biāo)簽,語(yǔ)句如圖5所示。
3.6獲取所有p標(biāo)簽里的文字
在進(jìn)行信息抓取時(shí),有時(shí)需要提取所有p標(biāo)簽里的內(nèi)容,這時(shí)就可以使用循環(huán)獲取。具體的語(yǔ)句如圖6所示。
以3.2的標(biāo)簽為例,運(yùn)行結(jié)果為:
這道菜俺從小吃到大,它是我兒時(shí)的全部味覺(jué)記憶。
美食網(wǎng)免責(zé)聲明。
3.7查找ul標(biāo)簽里的li標(biāo)簽
ul是無(wú)序列表標(biāo)簽,它與li標(biāo)簽配合使用,一對(duì)ul標(biāo)簽里可以包含若干對(duì)li標(biāo)簽。因?yàn)閡l標(biāo)簽也可以有多個(gè),因此ul標(biāo)簽也要和它的class屬性聯(lián)合起來(lái)使用,查找class='list1'的ul標(biāo)簽里的所有l(wèi)i標(biāo)簽,可以使用圖7的方法。
以3.2的標(biāo)簽為例,運(yùn)行結(jié)果
同理,也可以先定位到
3.8查找ul標(biāo)簽里的li標(biāo)簽內(nèi)的內(nèi)容
3.7中的方法,在獲取內(nèi)容時(shí),連同
運(yùn)行結(jié)果
食材準(zhǔn)備
制作過(guò)程
3.9 找到所有某類標(biāo)簽
如果要找到所有某標(biāo)簽,或者某幾種標(biāo)簽及根據(jù)正則表達(dá)式提取,只能用find_all返回一個(gè)列表,具體方法為:
soup.find_all('h2')
4 結(jié)束語(yǔ)
Beautiful Soup提供一些python式的函數(shù),通過(guò)解析文檔為用戶提供需要抓取的數(shù)據(jù),因?yàn)楹?jiǎn)單,所以不需要多少代碼就可以寫(xiě)出一個(gè)完整的應(yīng)用程序。Beautiful Soup已成為和lxml、html6lib一樣出色的Python解釋器,為用戶靈活地提供不同的解析策略或強(qiáng)勁的速度。
參考文獻(xiàn):
[1] 周德懋,李舟軍.高性能網(wǎng)絡(luò)爬蟲(chóng):研究綜述[J].計(jì)算機(jī)科學(xué),2009,36(8):26-29,53.
[2] 霍柄良.基于Python的網(wǎng)絡(luò)爬蟲(chóng)技術(shù)探析[J].數(shù)碼世界,2020(4):73-74.
[3] 王鵬,鄭貴省,郭強(qiáng),等.基于網(wǎng)絡(luò)爬蟲(chóng)的民用運(yùn)力數(shù)據(jù)獲取[J].軍事交通學(xué)院學(xué)報(bào),2020,22(1):87-90.
[4] 王曉楠,李楊,張海峰,張宇.面向網(wǎng)絡(luò)爬蟲(chóng)的網(wǎng)站優(yōu)化策略[J].農(nóng)家參謀,2020(5).
[5] 鐘機(jī)靈.基于Python網(wǎng)絡(luò)爬蟲(chóng)技術(shù)的數(shù)據(jù)采集系統(tǒng)研究[J].信息通信,2020,33(4):96-98.
[6] 李杰秦.基于Python語(yǔ)言下網(wǎng)絡(luò)爬蟲(chóng)的技術(shù)特點(diǎn)及應(yīng)用設(shè)計(jì)[J].數(shù)字通信世界,2020(1):209-210.
[7] 陳麗娟,王科,李晨曦. 淺談Python網(wǎng)絡(luò)爬蟲(chóng)技術(shù)基礎(chǔ)知識(shí)[J].計(jì)算機(jī)系統(tǒng)網(wǎng)絡(luò)和電信,2019,1(2):46-49.
[8] 馮丹.基于網(wǎng)絡(luò)爬蟲(chóng)的搜索引擎的研究[J].移動(dòng)信息,2019(8):121-122.
【通聯(lián)編輯:王力】