<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
初學 Python 爬蟲,十之八九大家採集的目標是網頁,因此快速定位到網頁內容,就成為我們面臨的第一道障礙,本篇部落格就為你詳細說明最易上手的網頁元素定位術,學完就會系列。
本文核心使用到的是 Beautiful Soup 模組,因此我們用來做測試採集的站點,也是其官網(現階段爬蟲採集越來越嚴格,很多站點不能在採集了,很容易被封殺,只能學誰就採集誰了)
官方站點:
www.crummy.com/software/BeautifulSoup/
Beautiful Soup 在 Python 爬蟲圈知名度極高,而且非常好用,它是一款 Python 解析庫,主要用於將 HTML 標籤轉換為 Python 物件樹,然後讓我們從物件樹中提取資料。
模組的安裝及其簡單:
pip install bs4 -i 國內任意源即可
未來安裝任何模組,都儘量使用國內源,速度快穩定。
該模組包名稱為 bs4,安裝的時候需要特別注意下。
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)
其中需要注意的就是模組匯入程式碼,以及範例化 soup
物件時,在 BeautifulSoup
類別建構函式中傳遞的兩個引數,一個是待解析的字串,另一個是解析器,官方建議的是 lxml
,因其解析速度快。
上述程式碼輸出的內容如下所示,看上去就是普通的 HTML 程式碼檔案。
而且我們可以呼叫 soup
物件的 soup.prettify()
方法,可以將 HTML 標籤進行格式化操作,這樣你就可以在儲存到外部檔案的時候,讓其 HTML 程式碼進行美觀。
BeautifulSoup 類可以將 HTML 文字解析成 Python 物件樹,而這裡面又包括最重要的四種物件,分別是 Tag
,NavigableString
,BeautifulSoup
,Comment
物件,接下來我們一一介紹。
該物件本身就代表整個 HTML 頁面,而且範例化該物件的時候,還會自動補齊 HTML 程式碼。
html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') print(type(soup))
Tag 是標籤的意思,Tag 物件就是網頁標籤,或者叫做網頁元素物件,例如獲取 bs4 官網的 h1 標籤物件,程式碼如下所示:
if __name__ == '__main__': html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') # print(soup.prettify()) # 格式化 HTML print(soup.h1)
得到的也是網頁中的 h1 標籤:
<h1>Beautiful Soup</h1>
用 Python 中的 type 函數,可以檢視其型別,程式碼如下:
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) # 獲取網頁第一個 img 標籤 print(soup.img['src']) # 獲取網頁元素DOM的屬性值
通過 attrs 屬性獲取標籤的所有屬性
print(soup.img) # 獲取網頁第一個 img 標籤 print(soup.img.attrs) # 獲取網頁元素的所有屬性值,以字典形式返回
以上程式碼的所有輸出如下所示,可以任意選擇標籤進行練習。
<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 物件獲取的是標籤內部的文字內容,例如p
標籤,在下述程式碼中提取的是我是橡皮擦
<p>我是橡皮擦</p>
獲取該物件也非常容易,使用 Tag 物件的 string 屬性即可。
nav_obj = soup.h1.string print(type(nav_obj))
輸出結果如下所示:
<class 'bs4.element.NavigableString'>
如果目標標籤是一個單標籤,會獲取到 None 資料
除了使用物件的string
方法外,還可以使用text
屬性和get_text()
方法來獲取標籤內容
print(soup.h1.text) print(soup.p.get_text()) print(soup.p.get_text('&'))
其中 text
是獲取所有子標籤內容的合併字串,而get_text()
也是相同的效果,不過使用get_text()
可以增加一個分隔符,例如上述程式碼的&
符號,還可以使用,strip=True 引數去除空格。
BeautifulSoup 物件和 Tag 物件支援標籤查詢方法,具體內容如下所示。
呼叫 BeautifulSoup 物件和 Tag 物件的find()
方法,可以在網頁中找到指定物件,
該方法的語法格式如下:
obj.find(name,attrs,recursive,text,**kws)
方法的返回結果是查詢到的第一個元素,如果沒查詢到,返回 None。 引數說明如下:
name
:標籤名稱;attrs
:標籤屬性;recursive
:預設搜尋所有後代元素;text
:標籤內容。例如我們繼續在上文請求的網頁中,查詢a
標籤,程式碼如下:
html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') print(soup.find('a'))
也可以使用attrs
引數進行查詢,程式碼如下:
html_str = ret_html() soup = BeautifulSoup(html_str, 'lxml') # print(soup.find('a')) print(soup.find(attrs={'class': 'cta'}))
find()
方法還提供了一些特殊的引數,便於直接查詢,例如可以使用id=xxx
,查詢屬性中包含 id
的標籤,可以使用class_=xxx
,查詢屬性中包含class
的標籤。
print(soup.find(class_='cta'))
與find()
方法成對出現的是find_all()
方法,看名稱就能知道其返回結果收是全部匹配標籤,語法格式如下:
obj.find_all(name,attrs,recursive,text,limit)
其中重點說明一下limit
引數,它表示最多返回的匹配數量,find()
方法可以看作limit=1
,這樣就變得容易理解了。
到此這篇關於Python爬蟲網頁元素定位術的文章就介紹到這了,更多相關Python元素定位內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45