Python爬蟲網(wǎng)頁元素定位術(shù)
實(shí)戰(zhàn)場(chǎng)景
初學(xué) Python 爬蟲,十之八九大家采集的目標(biāo)是網(wǎng)頁,因此快速定位到網(wǎng)頁內(nèi)容,就成為我們面臨的第一道障礙,本篇博客就為你詳細(xì)說明最易上手的網(wǎng)頁元素定位術(shù),學(xué)完就會(huì)系列。
本文核心使用到的是 Beautiful Soup 模塊,因此我們用來做測(cè)試采集的站點(diǎn),也是其官網(wǎng)(現(xiàn)階段爬蟲采集越來越嚴(yán)格,很多站點(diǎn)不能在采集了,很容易被封殺,只能學(xué)誰就采集誰了)
官方站點(diǎn):
www.crummy.com/software/BeautifulSoup/
Beautiful Soup 在 Python 爬蟲圈知名度極高,而且非常好用,它是一款 Python 解析庫,主要用于將 HTML 標(biāo)簽轉(zhuǎn)換為 Python 對(duì)象樹,然后讓我們從對(duì)象樹中提取數(shù)據(jù)。
模塊的安裝及其簡單:
pip install bs4 -i 國內(nèi)任意源即可
未來安裝任何模塊,都盡量使用國內(nèi)源,速度快穩(wěn)定。
該模塊包名稱為 bs4,安裝的時(shí)候需要特別注意下。
基礎(chǔ)用法如下所示
import requests from bs4 import BeautifulSoup def ret_html(): """獲取HTML元素""" res = requests.get('https://www.crummy.com/software/BeautifulSoup/', timeout=3) return res.text if __name__ == '__main__': html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') print(soup)
其中需要注意的就是模塊導(dǎo)入代碼,以及實(shí)例化 soup
對(duì)象時(shí),在 BeautifulSoup
類的構(gòu)造函數(shù)中傳遞的兩個(gè)參數(shù),一個(gè)是待解析的字符串,另一個(gè)是解析器,官方建議的是 lxml
,因其解析速度快。
上述代碼輸出的內(nèi)容如下所示,看上去就是普通的 HTML 代碼文件。
而且我們可以調(diào)用 soup
對(duì)象的 soup.prettify()
方法,可以將 HTML 標(biāo)簽進(jìn)行格式化操作,這樣你就可以在存儲(chǔ)到外部文件的時(shí)候,讓其 HTML 代碼進(jìn)行美觀。
BeautifulSoup 模塊的對(duì)象說明
BeautifulSoup 類可以將 HTML 文本解析成 Python 對(duì)象樹,而這里面又包括最重要的四種對(duì)象,分別是 Tag
,NavigableString
,BeautifulSoup
,Comment
對(duì)象,接下來我們一一介紹。
BeautifulSoup 對(duì)象
該對(duì)象本身就代表整個(gè) HTML 頁面,而且實(shí)例化該對(duì)象的時(shí)候,還會(huì)自動(dòng)補(bǔ)齊 HTML 代碼。
html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') print(type(soup))
Tag 對(duì)象
Tag 是標(biāo)簽的意思,Tag 對(duì)象就是網(wǎng)頁標(biāo)簽,或者叫做網(wǎng)頁元素對(duì)象,例如獲取 bs4 官網(wǎng)的 h1 標(biāo)簽對(duì)象,代碼如下所示:
if __name__ == '__main__': html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') # print(soup.prettify()) # 格式化 HTML print(soup.h1)
得到的也是網(wǎng)頁中的 h1 標(biāo)簽:
<h1>Beautiful Soup</h1>
用 Python 中的 type 函數(shù),可以查看其類型,代碼如下:
print(soup.h1) print(type(soup.h1))
此時(shí)得到的可不是一個(gè)字符串,而是一個(gè) Tag 對(duì)象。
<h1>Beautiful Soup</h1> <class 'bs4.element.Tag'>
既然是 Tag 對(duì)象,那就會(huì)具備一些特定的屬性值
獲取標(biāo)簽名稱
print(soup.h1) print(type(soup.h1)) print(soup.h1.name) # 獲取標(biāo)簽名稱
通過 Tag 對(duì)象獲取標(biāo)簽的屬性值
print(soup.img) # 獲取網(wǎng)頁第一個(gè) img 標(biāo)簽 print(soup.img['src']) # 獲取網(wǎng)頁元素DOM的屬性值
通過 attrs 屬性獲取標(biāo)簽的所有屬性
print(soup.img) # 獲取網(wǎng)頁第一個(gè) img 標(biāo)簽 print(soup.img.attrs) # 獲取網(wǎng)頁元素的所有屬性值,以字典形式返回
以上代碼的所有輸出如下所示,可以任意選擇標(biāo)簽進(jìn)行練習(xí)。
<h1>Beautiful Soup</h1> <class 'bs4.element.Tag'> h1 <img align="right" src="10.1.jpg" width="250"/> {'align': 'right', 'src': '10.1.jpg', 'width': '250'}
NavigableString 對(duì)象
NavigableString 對(duì)象獲取的是標(biāo)簽內(nèi)部的文字內(nèi)容,例如p
標(biāo)簽,在下述代碼中提取的是我是橡皮擦
<p>我是橡皮擦</p>
獲取該對(duì)象也非常容易,使用 Tag 對(duì)象的 string 屬性即可。
nav_obj = soup.h1.string print(type(nav_obj))
輸出結(jié)果如下所示:
<class 'bs4.element.NavigableString'>
如果目標(biāo)標(biāo)簽是一個(gè)單標(biāo)簽,會(huì)獲取到 None 數(shù)據(jù)
除了使用對(duì)象的string
方法外,還可以使用text
屬性和get_text()
方法來獲取標(biāo)簽內(nèi)容
print(soup.h1.text) print(soup.p.get_text()) print(soup.p.get_text('&'))
其中 text
是獲取所有子標(biāo)簽內(nèi)容的合并字符串,而get_text()
也是相同的效果,不過使用get_text()
可以增加一個(gè)分隔符,例如上述代碼的&
符號(hào),還可以使用,strip=True 參數(shù)去除空格。
Comment 對(duì)象
BeautifulSoup 對(duì)象和 Tag 對(duì)象支持標(biāo)簽查找方法,具體內(nèi)容如下所示。
find() 方法和 find_all() 方法
調(diào)用 BeautifulSoup 對(duì)象和 Tag 對(duì)象的find()
方法,可以在網(wǎng)頁中找到指定對(duì)象,
該方法的語法格式如下:
obj.find(name,attrs,recursive,text,**kws)
方法的返回結(jié)果是查找到的第一個(gè)元素,如果沒查詢到,返回 None。 參數(shù)說明如下:
name
:標(biāo)簽名稱;attrs
:標(biāo)簽屬性;recursive
:默認(rèn)搜索所有后代元素;text
:標(biāo)簽內(nèi)容。
例如我們繼續(xù)在上文請(qǐng)求的網(wǎng)頁中,查找a
標(biāo)簽,代碼如下:
html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') print(soup.find('a'))
也可以使用attrs
參數(shù)進(jìn)行查找,代碼如下:
html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') # print(soup.find('a')) print(soup.find(attrs={'class': 'cta'}))
find()
方法還提供了一些特殊的參數(shù),便于直接查找,例如可以使用id=xxx
,查找屬性中包含 id
的標(biāo)簽,可以使用class_=xxx
,查找屬性中包含class
的標(biāo)簽。
print(soup.find(class_='cta'))
與find()
方法成對(duì)出現(xiàn)的是find_all()
方法,看名稱就能知道其返回結(jié)果收是全部匹配標(biāo)簽,語法格式如下:
obj.find_all(name,attrs,recursive,text,limit)
其中重點(diǎn)說明一下limit
參數(shù),它表示最多返回的匹配數(shù)量,find()
方法可以看作limit=1
,這樣就變得容易理解了。
到此這篇關(guān)于Python爬蟲網(wǎng)頁元素定位術(shù)的文章就介紹到這了,更多相關(guān)Python元素定位內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python爬蟲lxml庫解析xpath網(wǎng)頁過程示例
- 使用pyscript在網(wǎng)頁中撰寫Python程式的方法
- 一文教會(huì)你用Python獲取網(wǎng)頁指定內(nèi)容
- Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁爬蟲
- Python實(shí)現(xiàn)網(wǎng)頁文件轉(zhuǎn)PDF文件和PNG圖片的示例代碼
- requests.gPython?用requests.get獲取網(wǎng)頁內(nèi)容為空?’?’問題
- python爬取網(wǎng)頁數(shù)據(jù)到保存到csv
- 利用Python自制網(wǎng)頁并實(shí)現(xiàn)一鍵自動(dòng)生成探索性數(shù)據(jù)分析報(bào)告
相關(guān)文章
tensorflow 獲取變量&打印權(quán)值的實(shí)例講解
今天小編就為大家分享一篇tensorflow 獲取變量&打印權(quán)值的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06python繪圖時(shí),坐標(biāo)軸負(fù)號(hào)顯示不出來的解決
這篇文章主要介紹了python繪圖時(shí),坐標(biāo)軸負(fù)號(hào)顯示不出來的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09python GUI庫圖形界面開發(fā)之PyQt5布局控件QHBoxLayout詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5布局控件QHBoxLayout詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03Python+Selenium實(shí)現(xiàn)自動(dòng)填寫問卷
本文主要介紹了Python+Selenium實(shí)現(xiàn)自動(dòng)填寫問卷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Anaconda配置各版本Pytorch的實(shí)現(xiàn)
本文是整理目前全版本pytorch深度學(xué)習(xí)環(huán)境配置指令,以下指令適用Windows操作系統(tǒng),在Anaconda Prompt中運(yùn)行,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08