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 解析庫(kù),主要用于將 HTML 標(biāo)簽轉(zhuǎn)換為 Python 對(duì)象樹,然后讓我們從對(duì)象樹中提取數(shù)據(jù)。
模塊的安裝及其簡(jiǎn)單:
pip install bs4 -i 國(guó)內(nèi)任意源即可
未來安裝任何模塊,都盡量使用國(guó)內(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庫(kù)解析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)文章
聊聊Python中的浮點(diǎn)數(shù)運(yùn)算不準(zhǔn)確問題
這篇文章主要介紹了聊聊Python中的浮點(diǎn)數(shù)運(yùn)算不準(zhǔn)確問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Scrapy基于selenium結(jié)合爬取淘寶的實(shí)例講解
今天小編就為大家分享一篇Scrapy基于selenium結(jié)合爬取淘寶的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
利用keras加載訓(xùn)練好的.H5文件,并實(shí)現(xiàn)預(yù)測(cè)圖片
今天小編就為大家分享一篇利用keras加載訓(xùn)練好的.H5文件,并實(shí)現(xiàn)預(yù)測(cè)圖片,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01

