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