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