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