摘要:方法作用查找所有符合條件的元素,返回的是列表形式參數可以根據節點名來查找元素。示例查詢第一個標簽查找第一個節點內容中有字符串的節點內容運行結果關于的使用就這樣吧,常用個人就覺得用好即可參考鏈接崔慶才網絡爬蟲開發實戰使用
BeautifulSoup介紹
與lxml一樣,BeautifulSoup也是一個HTML/XML的解析器,主要功能也是如何解析和提取HTML/XML數據。
幾種解析工具的對比
工具 | 速度 | 難度 | |
---|---|---|---|
正則表達式 | 最快 | 困難 | |
BeautifulSoup | 慢 | 最簡單 | |
lxml | 快 | 簡單 |
lxml 只會局部遍歷,而Beautiful Soup 是基于HTML DOM的,會載入整個文檔,解析整個DOM樹,因此時間和內存開銷都會大很多,所以性能要低于lxml。
安裝
我的環境是Python 3.6.5,windows下cmd里執行pip安裝即可。
pip3 install beautifulsoup4
測試
python終端里導入beautifulsoup,無報錯信息即安裝成功。
>>from bs4 import BeautifulSoup >>BeautifulSoup對象
BeautifulSoup將復雜的HTML文檔轉換成一個復雜的樹形結構,每個節點都是Python對象,所有對象可以歸納為4種:
Tag
NavigableString
BeautifulSoup
Comment
BeautifulSoup 對象表示的是一個文檔的內容。大部分時候,可以把它當作 Tag 對象,是一個特殊的 Tag。
Comment 對象是一個特殊類型的 NavigableString 對象,其輸出的內容不包括注釋符號。
Tag可以簡單理解為HTML文檔中的一個個的標簽,比如:
The Dormouse"s story first item
上面HTML文檔中的head、title、ur、li都是HTML標簽(節點名稱),這些標簽加上里面的內容就是tag。
獲取Tags
# 導入模塊 from bs4 import BeautifulSoup html = """The Dormouse"s story The Dormouse"s story
Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.
...
""" # 初始化BeautifulSoup對象,指定lxml解析器 soup = BeautifulSoup(html, "lxml") # prettify()方法格式化soup的內容 print(soup.prettify()) # soup.title選出title節點 print(soup.title) #The Dormouse"s story print(type(soup.title)) #print(soup.head) # The Dormouse"s story print(soup.p) #The Dormouse"s story
說明:使用soup加節點名稱可以獲取節點內容,這些對象的類型是bs4.element.Tag,但是它查找的是在內容中第一個符合要求的節點。比如上面代碼有多個p標簽,但是它只查找了第一個p標簽。
對于Tag有兩個重要的屬性,name和attrs。當選擇一個節點后,name屬性獲取節點的名稱,attrs屬性獲取節點的屬性(以字典形式返回)。
print(soup.name) # [document] #soup 對象本身比較特殊,它的 name 即為 [document] print(soup.head.name) # head #對于其他內部標簽,輸出的值便為標簽本身的名稱 print(soup.p.attrs) # {"class": ["title"], "name": "dromouse"} # 在這里,我們把 p 標簽的所有屬性打印輸出了出來,得到的類型是一個字典。 # 下面三種方法都可以獲取字典里的值,是等價的,結果都一樣 print(soup.p.get("class")) # ["title"] print(soup.p["class"]) # ["title"] print(soup.p.attrs["class"]) # ["title"] # 還可以針對屬性或者內容進行修改 soup.p["class"] = "newClass" print (soup.p) #NavigableStringThe Dormouse"s story
獲取了Tag,也就是獲取了節點內容,但是只想要獲取節點內部的內容怎么辦?只需使用.string即可。
# 獲取節點內容 print(soup.p.string) # The Dormouse"s story print(type(soup.p.string)) #遍歷文檔樹
在選取節點的時候,也可以先選取一個節點,然后以這個節點為基準選取它的子節點,父節點,子孫節點等等,下面就介紹常用的選取方法。
獲取直接子節點.contents .children屬性.contents
tag的.contents屬性可以將tag的直接子節點以列表的方式輸出。
下面例子選取head節點為基準,.contents選取head的子節點title,然后以列表返回。
print(soup.head.contents) # [The Dormouse"s story ]
輸出方式為列表,可以用列表索引來獲取它的某一個元素.
print(soup.head.contents[0]) #The Dormouse"s story
.children
children屬性和contents屬性不同的是它返回的不是一個列表,而是一個生成器??捎胒or循環輸出結果。
print(soup.head.children) #獲取所有子孫節點:.descendants屬性for i in soup.head.children: print(i) # The Dormouse"s story
上面兩個屬性都只能獲取到基準節點的下一個節點,要想獲取節點的所有子孫節點,就可以使用descendants屬性了。它返回的也是一個生成器。
print(soup.descendants) #
還有其他屬性如查找父節點,組父節點的屬性就不記錄了(平時很少用)。
搜索文檔樹BeautifulSoup提供了一些查詢方法(find_all,find等),調用對應方法,輸入查詢參數就可以得到我們想要的內容了,可以理解為搜索引擎的功能。(百度/谷歌=查詢方法,查詢內容=查詢參數,返回的網頁=想要的內容)
下面介紹最常用的find_all方法。
作用:查找所有符合條件的元素,返回的是列表形式
API:find_all(name, attrs, recursive, text, **kwargs)
1. name
name 參數可以根據節點名來查找元素。
A. 傳字符串
最簡單的過濾器是字符串.在搜索方法中傳入一個字符串參數,BeautifulSoup會查找與字符串完整匹配的內容,下面的例子用于查找文檔中所有的
標簽。
print(soup.find_all("p")) # 通常以下面方式寫比較好 print(soup.find_all(name="p"))
B.傳正則表達式
如果傳入正則表達式作為參數,Beautiful Soup會通過正則表達式的 match() 來匹配內容.下面例子中找出所有以p開頭的標簽。
import re print(soup.find_all(re.compile("^p")))
C.傳列表
如果傳入列表參數,BeautifulSoup會將與列表中任一元素匹配的內容返回。下面代碼會找到HTML代碼中的head標簽和b標簽。
print(soup.find_all(["head","b"])) # [The Dormouse"s story , The Dormouse"s story]
2. attrs
find_all中attrs參數可以根據節點屬性查詢。
查詢時傳入的參數是字典類型。比如查詢id=link1的節點
print(soup.find_all(attrs={"id":"link1"})) # []
對于常見的屬性,可以不用以attrs來傳遞,直接傳入查詢參數即可。比如id,class_(class為Python關鍵字,使用下劃線區分),如下:
print(soup.find_all(id="link1")) print(soup.find_all(class_="sister"))
運行結果:
[] [, Lacie, Tillie]
3. text
text 參數可以搜搜文檔中的字符串內容,與 name 參數的可選值一樣, text 參數接受 字符串 , 正則表達式 , 列表。下面代碼查找節點里內容中有story字符串的節點,并返回節點的內容。
print(soup.find_all(text=re.compile("story"))) # ["The Dormouse"s story", "The Dormouse"s story"]find方法
find方法與find_all方法的區別:
find_all:查詢符合所有條件的元素,返回列表。
find:只查找第一個匹配到的元素,返回單個元素,類型tag。
查詢方法與find_all大同小異。示例:
print(soup.find(name="p")) # 查詢第一個p標簽 print(soup.find(text=re.compile("story"))) # 查找第一個節點內容中有story字符串的節點內容
運行結果:
The Dormouse"s story
The Dormouse"s story
關于BeautifulSoup的使用就這樣吧,常用個人就覺得用好find_all即可(=.=~)參考鏈接
崔慶才 [Python3網絡爬蟲開發實戰]:4.2-使用Beautiful Soup
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43388.html
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:學習筆記七數學形態學關注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學習筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現代方法基于區域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...
摘要:學習爬蟲的背景了解。但是搜索引擎蜘蛛的爬行是被輸入了一定的規則的,它需要遵從一些命令或文件的內容,如標注為的鏈接,或者是協議。不同領域不同背景的用戶往往具有不同的檢索目的和需求,搜索引擎無法提供針對具體某個用戶的搜索結果。 學習python爬蟲的背景了解。 大數據時代數據獲取方式 如今,人類社會已經進入了大數據時代,數據已經成為必不可少的部分,可見數據的獲取非常重要,而數據的獲取的方式...
摘要:基本結構語言中,一個頁面是由四個部分組成文檔聲明標簽對標簽對標簽對圖示文檔聲明這是一個文檔聲明,表示這是一個頁面。標簽標簽表示頁面內容的范圍。 HTML HTML ...
閱讀 1669·2021-11-17 09:33
閱讀 3531·2021-11-16 11:40
閱讀 3055·2019-08-30 11:23
閱讀 1048·2019-08-29 16:36
閱讀 2464·2019-08-29 13:23
閱讀 1738·2019-08-29 12:59
閱讀 1542·2019-08-29 12:42
閱讀 1979·2019-08-28 18:22