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

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

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

2.5 CSS選擇器
相對(duì)來說通過CSS選擇器來進(jìn)行文檔搜索就很豐富了,可以通過標(biāo)簽、類名、id名、標(biāo)簽屬性和子標(biāo)簽等等方式來進(jìn)行搜索,不一樣的是我們會(huì)使用bs.select()方法來篩選
# css選擇器
print("-------(1)通過標(biāo)簽訪問")
t_css = bs.select('title') # 通過標(biāo)簽訪問
for item in t_css:
print(item)
print("-------(2)通過類名訪問")
t_css2 = bs.select(".col-sm-3") # 通過類名訪問
for item in t_css2:
print(item)
print("-------(3)通過id訪問")
t_css3 = bs.select("#btn_add")
for item in t_css3:
print(item)
print("-------(4)通過標(biāo)簽的屬性訪問")
t_css4 = bs.select("button[type='submit']")
for item in t_css4:
print(item)
# 注意不能有空格
print("-------(5)通過子標(biāo)簽訪問")
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)文章
Python根據(jù)字典值對(duì)字典進(jìn)行排序的三種方法實(shí)例
Python中的字典是無(wú)序類型,沒有自己的排序方法,下面這篇文章主要給大家介紹了關(guān)于Python根據(jù)字典值對(duì)字典進(jìn)行排序的三種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
python并發(fā)編程多進(jìn)程之守護(hù)進(jìn)程原理解析
這篇文章主要介紹了python并發(fā)編程多進(jìn)程之守護(hù)進(jìn)程原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Sublime如何配置Python3運(yùn)行環(huán)境
這篇文章主要介紹了Sublime如何配置Python3運(yùn)行環(huán)境問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
一個(gè)Python優(yōu)雅的數(shù)據(jù)分塊方法詳解
在做需求過程中有一個(gè)對(duì)大量數(shù)據(jù)分塊處理的場(chǎng)景,具體來說就是幾十萬(wàn)量級(jí)的數(shù)據(jù),分批處理,每次處理100個(gè)。這時(shí)就需要一個(gè)分塊功能的代碼。本文為大家分享了一個(gè)Python中優(yōu)雅的數(shù)據(jù)分塊方法,需要的可以參考一下2022-05-05
基于Python的A*算法解決八數(shù)碼問題實(shí)現(xiàn)步驟
這篇文章主要給大家介紹了關(guān)于如何基于Python的A*算法解決八數(shù)碼問題的實(shí)現(xiàn)步驟,文中介紹了八數(shù)碼問題及其求解方法,通過啟發(fā)式搜索算法,特別是A*算法,可以有效地解決八數(shù)碼問題,,需要的朋友可以參考下2024-11-11
python矩陣的轉(zhuǎn)置和逆轉(zhuǎn)實(shí)例
今天小編就為大家分享一篇python矩陣的轉(zhuǎn)置和逆轉(zhuǎn)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12

