大家好,我是辰哥 本文帶大家學(xué)習(xí)網(wǎng)頁解析庫BeautifulSoup, 并通過python代碼舉例講解常用的BeautifulSoup用法 最后實(shí)戰(zhàn)爬取小說網(wǎng)頁:重點(diǎn)在于爬取的網(wǎng)頁通過BeautifulSoup進(jìn)行解析。 在使用BeautifulSoup解析庫之前,先簡(jiǎn)單介紹一下BeautifulSoup庫并講解如何安裝BeautifulSoup庫。BeautifulSoup的基礎(chǔ)概念 BeautifulSoup支持Python標(biāo)準(zhǔn)庫中的Html解析器,還支持一些第三方解析器。利用它可以不用編寫正則表達(dá)式即可方便地實(shí)現(xiàn)網(wǎng)頁信息的提取。 安裝BeautifulSoup BeautifulSoup的安裝其實(shí)很簡(jiǎn)單,下面介紹兩種不同的安裝方式(適用不同的操作系統(tǒng))。 #方式一:pip安裝 pip install BeautifulSoup4
#方式二:wheel安裝 #下載對(duì)應(yīng)系統(tǒng)版本的wheel文件:http://www.lfd./~gohlke/pythonlibs pip install beautifulsoup4-4.9.3-py3-none-any.whl
方式一,通過pip install BeautifulSoup4命令就可以直接安裝; 方式二,需要通過下載whl文件,再去安裝。 其下載鏈接為:http://www.lfd./~gohlke/pythonlibs。訪問鏈接后下載beautifulsoup4-4.9.3-py3-none-any.whl。 上述內(nèi)容講解了獲取到一個(gè)BeautifulSoup 對(duì)象后,一般通過BeautifulSoup類的基本元素來提取html中的內(nèi)容。下表中列舉了BeautifulSoup的基本元素:基本元素見表所示: 基本元素 | 說明 | Tag | 標(biāo)簽,用<>和</>標(biāo)明開頭和結(jié)尾 | Name | 標(biāo)簽的名字 | Attributes | 標(biāo)簽的屬性 | NavigableString | 標(biāo)簽內(nèi)非屬性字符串 | Comment | 標(biāo)簽內(nèi)字符串的注釋部分 | 通過一個(gè)小例子,學(xué)習(xí)BeautifulSoup 庫如何去解析網(wǎng)頁并提取數(shù)據(jù)。首先構(gòu)造一個(gè)html網(wǎng)頁數(shù)據(jù),再將其解析為BeautifulSoup 對(duì)象。完整代碼如下: from bs4 import BeautifulSoup test_html = ''' <html> <body> <h4>學(xué)號(hào)</h4> <ul> <li>2112001</li> <li>2112002</li> <li class='blank'>2112003</li> <li>2112004</li> </ul> <h4>姓名</h4> <ul class='ul' style='color:red'> <li>張三</li> <li>李四</li> <li>王五</li> <li>老六</li> </ul> </body> </html> ''' # 把網(wǎng)頁解析為BeautifulSoup對(duì)象 soup = BeautifulSoup(test_html, 'html.parser') 首先是導(dǎo)入BeautifulSoup庫,然后構(gòu)造一段html源碼,最后解析為BeautifulSoup對(duì)象。下面通過幾個(gè)例子進(jìn)行講解提取數(shù)據(jù)。提取數(shù)據(jù) #提取首個(gè)h4元素 item = soup.find('h4') print(item) #提取所有的h4元素 items = soup.find_all('h4') print(items)
''' 結(jié)果: <h4>學(xué)號(hào)</h4> [<h4>學(xué)號(hào)</h4>, <h4>姓名</h4>] '''
區(qū)別: (1)find()只提取首個(gè)滿足要求的數(shù)據(jù) (2)find_all()提取出的是所有滿足要求的數(shù)據(jù) 精確定位提取數(shù)據(jù) # 查詢class為blank的li標(biāo)簽 print(soup.find('li',class_='blank')) # ul標(biāo)簽 print(soup.ul) # 獲取ul標(biāo)簽名字 print(soup.ul.name) # ul標(biāo)簽的父標(biāo)簽(上一級(jí)標(biāo)簽)的名字 print(soup.ul.parent.name) # ul標(biāo)簽的父標(biāo)簽的父標(biāo)簽的名字 print(soup.ul.parent.parent.name) ''' 結(jié)果: <li class='blank'>2112003</li>
<ul> <li>2112001</li> <li>2112002</li> <li class='blank'>2112003</li> <li>2112004</li> </ul>
ul body html '''
BeautifulSoup可以通過標(biāo)簽的class、id等屬性去定位網(wǎng)頁標(biāo)簽,此外還可以通過父級(jí)、子級(jí)關(guān)系去定位。內(nèi)容:抓取不同類型小說的書名和鏈接 思路:爬蟲抓取不同類型的小說網(wǎng)頁,并通過BeautifulSoup去解析網(wǎng)頁源碼,提取出數(shù)據(jù) 鏈接:http://book./all/id/18.html 在瀏覽器中訪問鏈接其頁面如下: 這里的鏈接對(duì)應(yīng)的是“奇幻玄幻”類型的小說,點(diǎn)擊不同的分類小說,就可以獲取到對(duì)應(yīng)的鏈接。這里以“奇幻玄幻”為例,進(jìn)行講解如何去爬取該類別的小說,并通過BeautifulSoup去解析頁面。以此類推,只需要更換不同的類型鏈接,就可以達(dá)到抓取不同類型的小說的效果。首先分析一下網(wǎng)頁源碼: 通過網(wǎng)頁源代碼可以清楚的知道頁面的所有小說都在class為listboxw的div標(biāo)簽里,而每一本小說都在dl標(biāo)簽中,我們需要抓取的小說書名和鏈接在dl標(biāo)簽下的dd標(biāo)簽中的第一個(gè)a標(biāo)簽里面。完整代碼如下: from bs4 import BeautifulSoup import requests # 設(shè)置代理服務(wù)器 headers = { 'User_Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'} #請(qǐng)求連接 url = 'http://book./all/id/18.html' response = requests.get(url, headers=headers) if response.status_code == 200: # 轉(zhuǎn)化為utf-8格式,不加這條語句,輸出爬取的信息為亂碼 response.encoding = 'utf8' # 把網(wǎng)頁解析為BeautifulSoup對(duì)象 soup = BeautifulSoup(response.text, 'html.parser') for element in soup.find_all(['dl', ['dd']]): a = element.find('a') if a.string!=None: print(a.string) print(a.get('href')) 代碼整體思路:先requests請(qǐng)求目標(biāo)鏈接,獲取到網(wǎng)頁源碼,然后通過BeautifulSoup去解析源碼,最后提取出小說書名和小說鏈接。因?yàn)樾≌f書名和小說鏈接都在a標(biāo)簽中,所以可以通過a.string去提取書名、a.get('href’)提取小說鏈接,最后輸出結(jié)果。結(jié)果: 智行斗羅 /novel/235.html 歷劫我是認(rèn)真的 /novel/234.html 開局獎(jiǎng)勵(lì)七張人物卡 /novel/233.html 被召喚到異界的喪尸 /novel/232.html ........
本文匯總BeautifulSoup常用的基本語法,并結(jié)合Python進(jìn)行舉例演示 最后實(shí)戰(zhàn)講解BeautifulSoup在爬蟲中的應(yīng)用。
|