Python使用BeautifulSoup4解析HTML文檔的操作指南
1.BeautifulSoup4簡(jiǎn)介
1.1 BS4與lxml
開(kāi)門(mén)見(jiàn)山!我們先來(lái)聊聊BS4是個(gè)啥,它能干啥,BS4是一個(gè)從HTML和XML文件中提取數(shù)據(jù)的python庫(kù),它可以將復(fù)雜HTML文件轉(zhuǎn)換為一個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu),這棵樹(shù)的每一個(gè)結(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象都可以歸納為4類(lèi),我們?cè)诤竺鏁?huì)說(shuō)
BeautifulSoup會(huì)自動(dòng)將輸入文檔轉(zhuǎn)換為Unicode編碼,將輸入文檔轉(zhuǎn)換為utf-8編碼
lxml與BS4一樣是優(yōu)秀的python解釋器,它也是,但是這二者有什么樣的區(qū)別,決定了我們?yōu)槭裁催x擇BeautifulSoup,lxml是從文檔的局部入手,只能局部遍歷,但BS4就不一樣了,它會(huì)載入整個(gè)文檔,解析整個(gè)DOM樹(shù),正是因?yàn)檫@個(gè)工程量巨大,所以BS4會(huì)有很大的時(shí)間和空間的開(kāi)銷(xiāo),整體性能是低于lxml的
但是我們使用BeautifulSoup4必有其原因:BS4用來(lái)解析HTML比較簡(jiǎn)單,API設(shè)計(jì)也是非常的銀性化(人性化)方便我們使用,它也支持CSS選擇器,這對(duì)于解析整個(gè)DOM樹(shù)的BS4可謂是如虎添翼,它還支持Python標(biāo)準(zhǔn)庫(kù)中的HTML解析器和lxml的XML解析器
1.2 BeautifulSoup的4類(lèi)對(duì)象
我們前面說(shuō):“將復(fù)雜HTML文件轉(zhuǎn)換為一個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu),這棵樹(shù)的每一個(gè)結(jié)點(diǎn)都是Python對(duì)象”,這些python可以大致分為4類(lèi):Tag、NavigableString、BeautifulSoup和Comment,我們通過(guò)幾個(gè)例子來(lái)熟悉一下這四類(lèi)對(duì)象的使用方法:
- 1.Tap 標(biāo)簽及其內(nèi)容,但默認(rèn)只拿到第一個(gè)
- 2.NavigableString 標(biāo)簽里的內(nèi)容(字符串)
- 3.BeautifulSoup 表示整個(gè)文檔
- 4.Comment 是一個(gè)特殊的NavigableString類(lèi)型,但輸出的內(nèi)容不包含注釋
首先第一步就是導(dǎo)包:from bs4 import BeautifulSoup;然后通過(guò)文件操作的語(yǔ)句來(lái)打開(kāi)我們項(xiàng)目中的一個(gè)html文件,用一個(gè)file對(duì)象接收我們的html文件后想要讓BeautifulSoup解析它,我們還需要傳入一個(gè)解析器:html.parser
from bs4 import BeautifulSoup
import re
file = open("./Demo.html", "rb")
html = file.read().decode("utf-8")
# 通過(guò)html.parser解析器把我們的HTML解析成了一棵樹(shù)
bs = BeautifulSoup(html, "html.parser")
# 1.Tap
print("1. Tap的例子:獲取title")
print(bs.title)
# 2.NavigableString
print("2. NavigableString的例子:獲取title的string內(nèi)容和div的屬性")
print(bs.title.string)
print(bs.div.attrs) # 獲取標(biāo)簽中的所有屬性,并返回一個(gè)字典
# 3.BeautifulSoup
print("3. BeautifulSoup的例子:獲取整個(gè)html文檔的name")
print(bs.name)
# 4.Comment
print("4. Comment的例子:獲取a的string")
print(bs.a.string)
按照以往管理咱來(lái)看看代碼!從第7行開(kāi)始我們對(duì)這四類(lèi)對(duì)象做了實(shí)例解釋,對(duì)應(yīng)Tap類(lèi)型,我們打印了bs.title,即這個(gè)HTML文檔的
標(biāo)簽的全部信息,第12、13行我們通過(guò)bs.title.string和bs.div.attrs打印了標(biāo)簽內(nèi)的信息,title的string信息和div盒子的屬性,后面的代碼也是同樣的道理

2.文檔搜索方式
我們?cè)谕ㄟ^(guò)網(wǎng)頁(yè)的地址獲取到其源碼后不可能直接使用,所以我們?cè)讷@取HTML源碼后要先對(duì)其進(jìn)行信息的定向搜索和篩選,然后再供我們使用,對(duì)應(yīng)BeautifulSoup的文檔搜索,它提供了這樣幾種搜索方式:使用find_all()方法直接搜索、使用kwargs指定參數(shù)進(jìn)行搜索、指定字符串搜索(常與正則表達(dá)式匹配使用)和設(shè)置limit參數(shù)進(jìn)行搜索,我們依舊通過(guò)一些實(shí)際操作來(lái)掌握這些搜索方法
2.1 使用find_all()搜索
- 字符串過(guò)濾:會(huì)查找與字符串完全匹配的內(nèi)容(注意一定是完全匹配)
- 正則表達(dá)式搜索:使用search()方法匹配內(nèi)容,它搜索的對(duì)象依舊是一個(gè)標(biāo)簽,一個(gè)整體而不是拆分開(kāi)來(lái)
t_list = bs.find_all("a")
t_list02 = bs.find_all(re.compile("a"))
對(duì)應(yīng)字符串搜索,我們往find_all()方法中傳入了一個(gè)字符串"a",進(jìn)行整個(gè)文檔的字符串過(guò)濾,只有含有單個(gè)"a"的內(nèi)容才會(huì)被篩選出來(lái),我們使用正則表達(dá)式搜索時(shí)往find_all()方法中傳入re.compile(“a”)這樣的一個(gè)匹配規(guī)則,它會(huì)返回所有含有"a"的標(biāo)簽內(nèi)容,比如等都不例外

2.2 使用kwargs指定參數(shù)搜索
同樣是使用find_all()方法進(jìn)行文檔搜索,但是我們往其中傳入的參數(shù)完全不同,舉兩個(gè)例子,我們要搜索id="update"的標(biāo)簽、有class字樣的標(biāo)簽還有href="baidu.html"的標(biāo)簽
# 2.kwargs (參數(shù)):指定參數(shù)進(jìn)行搜索
print("-------(1)顯示id=“update“的")
t_list03 = bs.find_all(id="update")
for item in t_list03:
print(item)
print("-------(2)只要有class就顯示出來(lái)")
t_list04 = bs.find_all(class_=True)
for item in t_list04:
print(item)
print("-------(3)指定查找href=”baidu.html“")
t_list05 = bs.find_all(href="baidu.html" rel="external nofollow" )
for item in t_list05:
print(item)

2.3 text參數(shù)搜索
使用text參數(shù)進(jìn)行搜索就稍顯輕松了,使用text搜索我們一般會(huì)使用列表和正則表達(dá)式搜索,這樣才能達(dá)到我們定向篩選數(shù)據(jù)的效果,話不多說(shuō)上代碼

2.4 設(shè)置limit參數(shù)搜索
如果我們通過(guò)代碼bs.find_all(class_=True)來(lái)篩選出存在"class"的部分,結(jié)果是有很多很多的,但是我們?nèi)绻幌胍?個(gè)結(jié)果,需要設(shè)置參數(shù)limit=x來(lái)滿足我們的需求
t_text10 = bs.find_all("a", limit=3)
for item in t_text10:
print(item)

2.5 CSS選擇器
相對(duì)來(lái)說(shuō)通過(guò)CSS選擇器來(lái)進(jìn)行文檔搜索就很豐富了,可以通過(guò)標(biāo)簽、類(lèi)名、id名、標(biāo)簽屬性和子標(biāo)簽等等方式來(lái)進(jìn)行搜索,不一樣的是我們會(huì)使用bs.select()方法來(lái)篩選
# css選擇器
print("-------(1)通過(guò)標(biāo)簽訪問(wèn)")
t_css = bs.select('title') # 通過(guò)標(biāo)簽訪問(wèn)
for item in t_css:
print(item)
print("-------(2)通過(guò)類(lèi)名訪問(wèn)")
t_css2 = bs.select(".col-sm-3") # 通過(guò)類(lèi)名訪問(wèn)
for item in t_css2:
print(item)
print("-------(3)通過(guò)id訪問(wèn)")
t_css3 = bs.select("#btn_add")
for item in t_css3:
print(item)
print("-------(4)通過(guò)標(biāo)簽的屬性訪問(wèn)")
t_css4 = bs.select("button[type='submit']")
for item in t_css4:
print(item)
# 注意不能有空格
print("-------(5)通過(guò)子標(biāo)簽訪問(wèn)")
t_css5 = bs.select("div > button")
for item in t_css5:
print(item)

以上就是Python使用BeautifulSoup4解析HTML文檔的操作指南的詳細(xì)內(nèi)容,更多關(guān)于Python BeautifulSoup4解析HTML的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pytorch和tensorflow計(jì)算Flops和params的詳細(xì)過(guò)程
這篇文章主要介紹了pytorch和tensorflow計(jì)算Flops和params,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
python flask實(shí)現(xiàn)分頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了python flask實(shí)現(xiàn)分頁(yè)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Python中FastAPI項(xiàng)目使用 Annotated的參數(shù)設(shè)計(jì)的處理方案
FastAPI 是一個(gè)非?,F(xiàn)代化和高效的框架,非常適合用于構(gòu)建高性能的 API,FastAPI 是一個(gè)用于構(gòu)建 API 的現(xiàn)代、快速(高性能)web 框架,基于 Python 類(lèi)型提示,這篇文章主要介紹了Python中FastAPI項(xiàng)目使用 Annotated的參數(shù)設(shè)計(jì),需要的朋友可以參考下2024-08-08
在Windows中設(shè)置Python環(huán)境變量的實(shí)例講解
下面小編就為大家分享一篇在Windows中設(shè)置Python環(huán)境變量的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

