Python爬蟲網(wǎng)頁元素定位術(shù)
實(shí)戰(zhàn)場景
初學(xué) Python 爬蟲,十之八九大家采集的目標(biāo)是網(wǎng)頁,因此快速定位到網(wǎng)頁內(nèi)容,就成為我們面臨的第一道障礙,本篇博客就為你詳細(xì)說明最易上手的網(wǎng)頁元素定位術(shù),學(xué)完就會系列。
本文核心使用到的是 Beautiful Soup 模塊,因此我們用來做測試采集的站點(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 對象樹,然后讓我們從對象樹中提取數(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
對象時(shí),在 BeautifulSoup
類的構(gòu)造函數(shù)中傳遞的兩個(gè)參數(shù),一個(gè)是待解析的字符串,另一個(gè)是解析器,官方建議的是 lxml
,因其解析速度快。
上述代碼輸出的內(nèi)容如下所示,看上去就是普通的 HTML 代碼文件。
而且我們可以調(diào)用 soup
對象的 soup.prettify()
方法,可以將 HTML 標(biāo)簽進(jìn)行格式化操作,這樣你就可以在存儲到外部文件的時(shí)候,讓其 HTML 代碼進(jìn)行美觀。
BeautifulSoup 模塊的對象說明
BeautifulSoup 類可以將 HTML 文本解析成 Python 對象樹,而這里面又包括最重要的四種對象,分別是 Tag
,NavigableString
,BeautifulSoup
,Comment
對象,接下來我們一一介紹。
BeautifulSoup 對象
該對象本身就代表整個(gè) HTML 頁面,而且實(shí)例化該對象的時(shí)候,還會自動補(bǔ)齊 HTML 代碼。
html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') print(type(soup))
Tag 對象
Tag 是標(biāo)簽的意思,Tag 對象就是網(wǎng)頁標(biāo)簽,或者叫做網(wǎng)頁元素對象,例如獲取 bs4 官網(wǎng)的 h1 標(biāo)簽對象,代碼如下所示:
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 對象。
<h1>Beautiful Soup</h1> <class 'bs4.element.Tag'>
既然是 Tag 對象,那就會具備一些特定的屬性值
獲取標(biāo)簽名稱
print(soup.h1) print(type(soup.h1)) print(soup.h1.name) # 獲取標(biāo)簽名稱
通過 Tag 對象獲取標(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 對象
NavigableString 對象獲取的是標(biāo)簽內(nèi)部的文字內(nèi)容,例如p
標(biāo)簽,在下述代碼中提取的是我是橡皮擦
<p>我是橡皮擦</p>
獲取該對象也非常容易,使用 Tag 對象的 string 屬性即可。
nav_obj = soup.h1.string print(type(nav_obj))
輸出結(jié)果如下所示:
<class 'bs4.element.NavigableString'>
如果目標(biāo)標(biāo)簽是一個(gè)單標(biāo)簽,會獲取到 None 數(shù)據(jù)
除了使用對象的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è)分隔符,例如上述代碼的&
符號,還可以使用,strip=True 參數(shù)去除空格。
Comment 對象
BeautifulSoup 對象和 Tag 對象支持標(biāo)簽查找方法,具體內(nèi)容如下所示。
find() 方法和 find_all() 方法
調(diào)用 BeautifulSoup 對象和 Tag 對象的find()
方法,可以在網(wǎng)頁中找到指定對象,
該方法的語法格式如下:
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ù)在上文請求的網(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()
方法成對出現(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python爬蟲lxml庫解析xpath網(wǎng)頁過程示例
- 使用pyscript在網(wǎng)頁中撰寫Python程式的方法
- 一文教會你用Python獲取網(wǎng)頁指定內(nèi)容
- Python用requests模塊實(shí)現(xiàn)動態(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)一鍵自動生成探索性數(shù)據(jù)分析報(bào)告
相關(guān)文章
tensorflow 獲取變量&打印權(quán)值的實(shí)例講解
今天小編就為大家分享一篇tensorflow 獲取變量&打印權(quán)值的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06python繪圖時(shí),坐標(biāo)軸負(fù)號顯示不出來的解決
這篇文章主要介紹了python繪圖時(shí),坐標(biāo)軸負(fù)號顯示不出來的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09python GUI庫圖形界面開發(fā)之PyQt5布局控件QHBoxLayout詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5布局控件QHBoxLayout詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03Python+Selenium實(shí)現(xiàn)自動填寫問卷
本文主要介紹了Python+Selenium實(shí)現(xiàn)自動填寫問卷,文中通過示例代碼介紹的非常詳細(xì),對大家的學(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