
作者:潮汐
來源:Python 技術(shù)
前面第一篇文章是關(guān)于 BeautifulSoup 爬蟲的基礎(chǔ)知識(shí)詳解第一部分,主要介紹了 BeautifulSoup 爬蟲的安裝過程及簡介,同時(shí)又快速學(xué)習(xí)了利用 BeautifulSoup 技術(shù)定位標(biāo)簽、獲取標(biāo)簽內(nèi)容的相關(guān)知識(shí)點(diǎn),今天的文章將深入地介紹 BeautifulSoup 技術(shù)的詳細(xì)語法及其相關(guān)用法。
BeautifulSoup 將復(fù)雜的 HTML 文檔轉(zhuǎn)換成一個(gè)樹形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是 Python 對(duì)象,BeautifulSoup 官方文檔將所有的對(duì)象歸納為以下四種:
接下來詳細(xì)介紹 BeautifulSoup 的四個(gè)對(duì)象:
Tag
Tag 對(duì)象表示 XML 或 HTML 文檔中的標(biāo)簽,通俗地講就是 HTML 中的一個(gè)個(gè)標(biāo)簽,該對(duì)象與 HTML 或 XML 原生文檔中的標(biāo)簽相同。Tag 有很多方法和屬性,BeautifulSoup 中定義為 soup.Tag,其中 Tag 為 HTML 中的標(biāo)簽,比如 a、title 等,其結(jié)果返回完整的標(biāo)簽內(nèi)容,包括標(biāo)簽的屬性和內(nèi)容等。例如以下實(shí)例就是 Tag:
<title>BeautifulSoup 技術(shù)詳解</title> <p class="title">Hello</p> <p class="con">Python 技術(shù)</p>
以上的 HTML 代碼中,title、p 都是標(biāo)簽,起始標(biāo)簽和結(jié)束標(biāo)簽之間加上內(nèi)容就是 Tag。標(biāo)簽獲取方法代碼如下:
#創(chuàng)建本地文件soup對(duì)象 soup = BeautifulSoup(open('test.html','rb'), "html.parser") #獲取a標(biāo)簽 a = soup.a #Tag print('a標(biāo)簽的內(nèi)容是:', a)
除此之外,Tag 中最重要的屬性是 name 和 attrs 。
name 屬性用于獲取文檔樹的標(biāo)簽名字,如果想獲取 title 標(biāo)簽的名字,只要使用 soup.title.name 代碼即可,對(duì)于內(nèi)部標(biāo)簽,輸出的值便為標(biāo)簽本身的名稱。
<a href="https://www.baidu.com" class="xiaodu" id="l1">ddd</a>
以上實(shí)例存在兩個(gè)屬性,一個(gè)是class屬性,對(duì)應(yīng)的值為“xiaodu”;一個(gè)是id屬性,對(duì)應(yīng)的值為“l(fā)1”。Tag屬性操作方法與Python字典相同,獲取p標(biāo)簽的所有屬性代碼如下,得到一個(gè)字典類型的值,它獲取的是第一個(gè)段落 p 的屬性及屬性值。
# 獲取屬性 print(soup.p.attrs) # 獲取屬性值 print(soup.a['class']) #[u'xiaodu'] print(soup.a.get('class')) #[u'l1']
BeautifulSoup 每個(gè)標(biāo)簽 tag 可能有很多個(gè)屬性,可以通過 “.attrs” 獲取屬性,tag 的屬性可以被修改、刪除或添加。
NavigableString
NavigableString 也叫可遍歷的字符串,字符串常被包含在 tag 內(nèi),BeautifulSoup 用 NavigableString 類來包裝tag中的字符串,
BeautifulSoup 用 NavigableString 類來包裝 tag 中的字符串,NavigableString 表示可遍歷的字符串。一個(gè) NavigableString 字符串與 Python 中的 Unicode 字符串相同,并且支持包含在遍歷文檔樹和搜索文檔樹中的一些特性。下述代碼可查看 NavigableString 的類型。
# coding=utf-8 from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html','rb'), "html.parser")
tag = soup.title print(type(tag.string))
輸出結(jié)果如下:
<class 'bs4.element.NavigableString'>
BeautifulSoup
BeautifulSoup 對(duì)象表示的是一個(gè)文檔的全部內(nèi)容,通常情況下把它當(dāng)作 Tag 對(duì)象,該對(duì)象支持遍歷文檔樹和搜索文檔樹中描述的大部分的方法,下面代碼是輸出 soup 對(duì)象的類型,輸出結(jié)果就是 BeautifulSoup 對(duì)象類型。
# coding=utf-8 from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html','rb'), "html.parser")
tag = soup.title print(type(soup))
輸出結(jié)果如下:
<class 'bs4.BeautifulSoup'>
因?yàn)?BeautifulSoup 對(duì)象并不是真正的 HTML 或 XML 的標(biāo)簽 tag,所以它沒有 name 和 attribute 屬性。但有時(shí)查看它的.name 屬性是很方便的,故 BeautifulSoup 對(duì)象包含了一個(gè)值為[document]的特殊屬性soup.name。下述代碼即是輸出 BeautifulSoup 對(duì)象的 name 屬性,其值為 [document]。
Comment
Comment 對(duì)象是一個(gè)特殊類型的 NavigableString 對(duì)象,它用于處理注釋對(duì)象。下面這個(gè)示例代碼用于讀取注釋內(nèi)容,代碼如下:
markup = "<b><!-- hello comment code --></b>"
soup = BeautifulSoup(markup, "html.parser")
comment = soup.b.string
print(type(comment))
print(comment)
if __name__ == '__main__':
mark()
輸出結(jié)果如下:
<class 'bs4.BeautifulSoup'> <class 'bs4.element.Comment'> hello comment code
以上內(nèi)容講解完 4 個(gè)對(duì)象后,下面的知識(shí)講解遍歷文檔樹和搜索文檔樹以及 BeatifulSoup 常用的函數(shù)。在 BeautifulSoup 中,一個(gè)標(biāo)簽(Tag)可能包含多個(gè)字符串或其它的標(biāo)簽,這些稱為這個(gè)標(biāo)簽的子標(biāo)簽。
咱們繼續(xù)用以下超文本協(xié)議來講解:
<!DOCTYPE html> <html lang="en"> <head> <title>BeautifulSoup 技術(shù)詳解</title> </head> <body> <p class="title">Hello</p> <p class="con">Python 技術(shù)</p> <a href="https://www.baidu.com" class="xiaodu" id="l1">ddd</a> </body> </html>
一個(gè)Tag可能包含多個(gè)字符串或其它的Tag,這些都是這個(gè)Tag的子節(jié)點(diǎn),Beautiful Soup 提供了許多操作和遍歷子節(jié)點(diǎn)的屬性。
例如獲取標(biāo)簽子節(jié)點(diǎn)內(nèi)容:
# coding=utf-8 from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html','rb'), "html.parser")
tag = soup.title print(soup.head.contents)
輸出結(jié)果如下:
['n', <title>BeautifulSoup 技術(shù)詳解</title>, 'n']
注意: Beautiful Soup中字符串節(jié)點(diǎn)不支持這些屬性,因?yàn)樽址疀]有子節(jié)點(diǎn)。
節(jié)點(diǎn)內(nèi)容
如果標(biāo)簽只有一個(gè)子節(jié)點(diǎn),需要獲取該子節(jié)點(diǎn)的內(nèi)容,則需要使用 string 屬性,以此輸出節(jié)點(diǎn)的內(nèi)容:
# coding=utf-8 from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html','rb'), "html.parser")
tag = soup.title print(soup.head.string) print(soup.title.string)
輸出結(jié)果如下:
None BeautifulSoup 技術(shù)詳解
調(diào)用 parent 屬性定位父節(jié)點(diǎn),如果需要獲取節(jié)點(diǎn)的標(biāo)簽名則使用 parent.name。實(shí)例如下:
# coding=utf-8 from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html','rb'), "html.parser")
tag = soup.title
p = soup.p print(p.parent) print(p.parent.name)
content = soup.head.title.string print(content.parent) print(content.parent.name)
輸出結(jié)果如下:
<body> <p class="title">Hello</p> <p class="con">Python 技術(shù)</p> <a class="xiaodu" href="https://www.baidu.com" id="l1">ddd</a> </body> body <title>BeautifulSoup 技術(shù)詳解</title> title
兄弟節(jié)點(diǎn)是指和本節(jié)點(diǎn)位于同一級(jí)的節(jié)點(diǎn),其中 next_sibling 屬性是獲取該節(jié)點(diǎn)的下一個(gè)兄弟節(jié)點(diǎn),previous_sibling 則與之相反,取該節(jié)點(diǎn)的上一個(gè)兄弟節(jié)點(diǎn),如果節(jié)點(diǎn)不存在,則返回 None。
print(soup.p.next_sibling) print(soup.p.prev_sibling)
調(diào)用屬性 next_element 可以獲取下一個(gè)節(jié)點(diǎn),調(diào)用屬性 previous_element 可以獲取上一個(gè)節(jié)點(diǎn),代碼舉例如下:
print(soup.p.next_element) print(soup.p.previous_element)
BeautifulSoup 定義了很多搜索方法,例如 find() 和 find_all(); 但find_all()是最常用的一種方法,而更多的方法與遍歷文檔樹類似,包括父節(jié)點(diǎn)、子節(jié)點(diǎn)、兄弟節(jié)點(diǎn)等,使用find_all()方法的代碼如下:
# coding=utf-8 from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html','rb'), "html.parser")
tag = soup.title
urls = soup.find_all('p') for u in urls: print(u)
輸出結(jié)果如下:
<p class="title">Hello</p>
<p class="con">Python 技術(shù)</p>
使用 find_all() 可以查找到想要查找的文檔內(nèi)容。
至此,阿醬理解范圍內(nèi)的 BeautifulSoup 基礎(chǔ)知識(shí)及用法基本上已經(jīng)概述完畢,有差池的地方希望大家海涵,我們一起努力前行。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10