如何用Python Beautiful?Soup解析HTML內(nèi)容
Beautiful Soup是一種Python的解析庫(kù),主要用于解析和處理HTML/XML內(nèi)容。它是基于Python的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)的結(jié)合,能夠提供簡(jiǎn)便的方式實(shí)現(xiàn)文本的查找、修改和提取操作。
HTML指的是超文本標(biāo)記語(yǔ)言(Hypertext Markup Language),即一種用于描述網(wǎng)頁(yè)內(nèi)容的標(biāo)記語(yǔ)言。在我們?cè)L問(wèn)一個(gè)網(wǎng)頁(yè)的時(shí)候,瀏覽器便會(huì)將HTML內(nèi)容下載到本地并以可視化的形式展示給我們。但是,在程序員的世界里我們需要能夠?qū)TML內(nèi)容進(jìn)行更多的操作,而B(niǎo)eautiful Soup就是這種工具之一。
Beautiful Soup能夠解析HTML內(nèi)容并轉(zhuǎn)化成一個(gè)復(fù)雜的樹(shù)結(jié)構(gòu),然后可以通過(guò)標(biāo)簽名、屬性名等多種方式進(jìn)行內(nèi)容的查找和修改。使用Beautiful Soup不僅能夠讓我們更高效地處理HTML內(nèi)容,而且還能避免很多手動(dòng)操作引起的誤差。
下面我們來(lái)詳細(xì)介紹Beautiful Soup的使用方式和應(yīng)用場(chǎng)景。
Beautiful Soup的使用
Beautiful Soup提供的解析器有bs3、bs4,其中bs3逐漸被棄用,目前bs4為最新版。我們主要介紹bs4的使用。
首先,我們需要安裝Beautiful Soup庫(kù)。在終端輸入以下命令:
pip install beautifulsoup4
安裝成功后,我們通過(guò)import語(yǔ)句將Beautiful Soup庫(kù)引入程序中。
from bs4 import BeautifulSoup
接下來(lái)假設(shè)我們有一個(gè)HTML文本:
<html> <head> <title>Beautiful Soup Tutorial</title> </head> <body> <div class="article"> <h1>Python BeautifulSoup Tutorial</h1> <p class="intro">這是一篇Beautiful Soup入門(mén)教程</p> <p class="content">它將介紹Beautiful Soup的基本用法以及一些高級(jí)的應(yīng)用場(chǎng)景</p> <a class="link" >點(diǎn)擊訪(fǎng)問(wèn)示例網(wǎng)站</a> </div> </body> </html>
我們可以通過(guò)以下語(yǔ)句將HTML文本解析成BeautifulSoup對(duì)象:
soup = BeautifulSoup(html_doc, 'html.parser')
其中,html_doc為上述HTML文本,'html.parser’為指定的解析器。
標(biāo)簽選擇器
Beautiful Soup提供了多種標(biāo)簽選擇器,能夠便捷地從HTML文本中選擇需要的內(nèi)容。
選擇標(biāo)簽名為h1的元素:
soup.select('h1')
結(jié)果為:
[<h1>Python BeautifulSoup Tutorial</h1>]
選擇標(biāo)簽名為p且class屬性為“intro”的元素:
soup.select('p.intro')
結(jié)果為:
[<p class="intro">這是一篇Beautiful Soup入門(mén)教程</p>]
選擇標(biāo)簽名為a且class屬性為“link”的元素,其href屬性的值為"http://www.example.com":
soup.select('a.link[)
結(jié)果為:
[<a class="link" href="http://www.example.com">點(diǎn)擊訪(fǎng)問(wèn)示例網(wǎng)站</a>]
標(biāo)簽樹(shù)操作
我們可以通過(guò)Beautiful Soup的樹(shù)型結(jié)構(gòu),對(duì)HTML文本進(jìn)行各種查找與修改操作。
嵌套選擇標(biāo)簽
可以通過(guò)嵌套選擇標(biāo)簽,定位到HTML文本中需要的標(biāo)簽,例如選擇“div”標(biāo)簽下的所有“p”標(biāo)簽。
content = soup.select('div.article > p')
可以看到,選擇結(jié)果為兩個(gè)“p”標(biāo)簽。
[<p class="intro">這是一篇Beautiful Soup入門(mén)教程</p>, <p class="content">它將介紹Beautiful Soup的基本用法以及一些高級(jí)的應(yīng)用場(chǎng)景</p>]
.string/.text屬性獲取標(biāo)簽內(nèi)容
可以通過(guò).string屬性或.text屬性獲取標(biāo)簽內(nèi)的文本內(nèi)容。
例如,獲取標(biāo)題“h1”標(biāo)簽內(nèi)的文本內(nèi)容:
title = soup.select('h1')[0].string print(title)
輸出結(jié)果為:
Python BeautifulSoup Tutorial
可以看到,.string相比于.text屬性更加精確,可以避免獲取到標(biāo)簽內(nèi)的其他內(nèi)容干擾。
.get()方法獲取標(biāo)簽屬性值
可以通過(guò).get()方法獲取標(biāo)簽內(nèi)的屬性值。例如,獲取“a”標(biāo)簽的href屬性值:
link = soup.select('a.link')[0].get('href') print(link)
輸出結(jié)果為:
http://www.example.com
修改HTML文本
除了查找與獲取HTML文本的內(nèi)容,我們還可以使用Beautiful Soup對(duì)HTML文本進(jìn)行修改操作。
修改標(biāo)簽屬性值
通過(guò)tag對(duì)象的.attrs屬性可以獲取標(biāo)簽的屬性,使用該屬性進(jìn)行修改操作。
例如,將“a”標(biāo)簽的href屬性值修改為“http://www.newexample.com”:
link_tag = soup.select('a.link')[0] link_tag['href'] = 'http://www.newexample.com' print(link_tag)
可以看到,輸出結(jié)果中href屬性值已經(jīng)被修改。
<a class = "link" >點(diǎn)擊訪(fǎng)問(wèn)示例網(wǎng)站</a>
修改標(biāo)簽文本內(nèi)容
通過(guò)tag對(duì)象的.string屬性或replace_with()方法可以修改標(biāo)簽的文本內(nèi)容。
例如,將第一個(gè)“p”標(biāo)簽的文本修改為“歡迎來(lái)到Beautiful Soup教程”:
p_tag = soup.select('p.intro')[0] p_tag.string = '歡迎來(lái)到Beautiful Soup教程' print(p_tag)
輸出結(jié)果為:
<p class = "intro">歡迎來(lái)到Beautiful Soup教程</p>
增加標(biāo)簽和刪除標(biāo)簽
我們可以使用Beautiful Soup提供的函數(shù),例如new_tag()、new_string()、append()和insert()等方法,創(chuàng)建新標(biāo)簽或文本,并插入HTML文本當(dāng)中。
例如,我們通過(guò)append()方法在“body”標(biāo)簽的末尾增加一個(gè)“div”標(biāo)簽:
new_div = soup.new_tag('div') new_div.string = '這是Beautiful Soup教程的結(jié)尾' soup.select('body')[0].append(new_div) print(soup)
可以看到,輸出結(jié)果中的HTML文本結(jié)尾增加了一個(gè)新的“div”標(biāo)簽。
應(yīng)用場(chǎng)景
美食網(wǎng)站信息爬取
我們將以美食網(wǎng)站中的“熱門(mén)排行榜”為例進(jìn)行演示。
首先,我們需要通過(guò)requests庫(kù)獲取HTML文本。以“熱門(mén)排行榜”頁(yè)面為例:
import requests from bs4 import BeautifulSoup url = 'https://www.meishij.net/chufang/diy/diy_rmphb/' html = requests.get(url) soup = BeautifulSoup(html.text, 'html.parser')
我們可以通過(guò)觀察HTML文本,發(fā)現(xiàn)熱門(mén)排行榜的信息在“div”標(biāo)簽中,具體位置在“div.zg_wrap”標(biāo)簽中,而餐品名稱(chēng)在“div.zg_wrap > li > div > p > a”標(biāo)簽中。因此,我們可以使用以下語(yǔ)句提取美食名稱(chēng):
for i, li in enumerate(soup.select('div.zg_wrap > li')): name = li.select('div > p > a')[0].get('title') print(f'{i+1}. {name}')
可以看到,我們已成功提取出了美食名稱(chēng),輸出結(jié)果如下:
1. 漢堡
2. 糯米飯
3. 明爐烤鴨
4. 龍蝦
5. 火鍋
6. 美式薯?xiàng)l
7. 叉燒肉
8. 紅燒肉
9. 快手美食
10. 韓國(guó)泡菜
至此,我們已經(jīng)成功通過(guò)Beautiful Soup解析庫(kù),提取出了美食網(wǎng)站的熱門(mén)排行榜信息,演示了Beautiful Soup在爬蟲(chóng)數(shù)據(jù)抓取和處理中的重要應(yīng)用。
總結(jié)
Beautiful Soup作為一種解析庫(kù),能夠方便地解析HTML/XML文本,提供多種標(biāo)簽選擇器并支持樹(shù)型結(jié)構(gòu)操作,可以快速定位和處理HTML/XML中需要的內(nèi)容,提高了爬蟲(chóng)數(shù)據(jù)抓取和處理的效率。對(duì)于Python爬蟲(chóng)初學(xué)者來(lái)說(shuō),掌握Beautiful Soup的使用是十分重要的。同時(shí)需要注意的是,在使用Beautiful Soup時(shí)需要遵循網(wǎng)絡(luò)道德規(guī)范,遵守網(wǎng)站的規(guī)定,避免對(duì)網(wǎng)站造成過(guò)度訪(fǎng)問(wèn)和其他影響。
到此這篇關(guān)于如何用Beautiful Soup解析HTML內(nèi)容的文章就介紹到這了,更多相關(guān)Beautiful Soup解析HTML內(nèi)容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python獲取基金網(wǎng)站網(wǎng)頁(yè)內(nèi)容、使用BeautifulSoup庫(kù)分析html操作示例
- Python使用Beautiful?Soup(BS4)庫(kù)解析HTML和XML
- python爬蟲(chóng)beautifulsoup解析html方法
- Python下利用BeautifulSoup解析HTML的實(shí)現(xiàn)
- Python HTML解析器BeautifulSoup用法實(shí)例詳解【爬蟲(chóng)解析器】
- python爬蟲(chóng)入門(mén)教程--HTML文本的解析庫(kù)BeautifulSoup(四)
- Python使用BeautifulSoup庫(kù)解析HTML基本使用教程
相關(guān)文章
Python使用微信接入圖靈機(jī)器人過(guò)程解析
這篇文章主要介紹了Python使用微信接入圖靈機(jī)器人過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Python操作RabbitMQ服務(wù)器實(shí)現(xiàn)消息隊(duì)列的路由功能
RabbitMQ是一個(gè)消息隊(duì)列服務(wù)器,這里我們針對(duì)Python+Pika+RabbitMQ的服務(wù)器端環(huán)境,來(lái)看一下如何使用Python操作RabbitMQ服務(wù)器實(shí)現(xiàn)消息隊(duì)列的路由功能2016-06-06在Flask使用TensorFlow的幾個(gè)常見(jiàn)錯(cuò)誤及解決
這篇文章主要介紹了在Flask使用TensorFlow的幾個(gè)常見(jiàn)錯(cuò)誤及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01超全面python常見(jiàn)報(bào)錯(cuò)以及解決方案梳理必收藏
使用python難免會(huì)出現(xiàn)各種各樣的報(bào)錯(cuò),以下是Python常見(jiàn)的報(bào)錯(cuò)以及解決方法(持續(xù)更新),快進(jìn)入收藏吃灰吧2022-03-03Python實(shí)現(xiàn)打印詳細(xì)報(bào)錯(cuò)日志,獲取報(bào)錯(cuò)信息位置行數(shù)
這篇文章主要介紹了Python實(shí)現(xiàn)打印詳細(xì)報(bào)錯(cuò)日志,獲取報(bào)錯(cuò)信息位置行數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08python基于json文件實(shí)現(xiàn)的gearman任務(wù)自動(dòng)重啟代碼實(shí)例
這篇文章主要介紹了python基于json文件實(shí)現(xiàn)的gearman任務(wù)自動(dòng)重啟代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python檢測(cè)空間儲(chǔ)存剩余大小和指定文件夾內(nèi)存占用的實(shí)例
今天小編就為大家分享一篇python檢測(cè)空間儲(chǔ)存剩余大小和指定文件夾內(nèi)存占用的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python中struct模塊對(duì)字節(jié)流/二進(jìn)制流的操作教程
最近在學(xué)習(xí)python網(wǎng)絡(luò)編程這一塊,在寫(xiě)簡(jiǎn)單的socket通信代碼時(shí),遇到了struct這個(gè)模塊的使用,當(dāng)時(shí)不太清楚這到底有和作用,后來(lái)查閱了相關(guān)資料大概了解了,這篇文章就主要介紹了Python中struct模塊對(duì)字節(jié)流/二進(jìn)制流的操作,需要的朋友可以參考借鑒。2017-01-01