Python Beautiful Soup 使用詳解

????????大家好,在網絡爬蟲和數據抓取的領域中,Beautiful Soup 是一個備受推崇的 Python 庫,它提供了強大而靈活的工具,幫助開發者輕松地解析 HTML 和 XML 文檔,并從中提取所需的數據。本文將深入探討 Beautiful Soup 的使用方法和各種功能,希望能給大家帶來一些幫助。

一、Beautiful Soup介紹

????????Beautiful Soup 是一個 Python 庫,用于解析 HTML 和 XML 文檔,并提供簡單而直觀的 API 來遍歷文檔樹、搜索元素、提取內容等。它的名字取自于《愛麗絲夢游仙境》中的一段描寫:“來吧,讓我們到美麗的湯中一起吃面包吧!”正如這句話所暗示的那樣,Beautiful Soup 讓我們可以輕松地“吃掉”網頁中的內容。

應用場景:

  1. 網絡爬蟲和數據抓取:Beautiful Soup 可以輕松地解析網頁 HTML 或 XML 文檔,并從中提取所需的數據,用于構建網絡爬蟲和進行數據抓取。

  2. 數據分析和挖掘:通過解析網頁中的結構化數據,Beautiful Soup 可以幫助開發者進行數據分析和挖掘,發現數據之間的關系和規律。

  3. 網頁內容提取:Beautiful Soup 可以提取網頁中的各種內容,包括文本、鏈接、圖片、表格等,用于構建內容提取系統和網頁分析工具。

  4. 自動化測試:Beautiful Soup 可以用于自動化測試框架中,幫助測試人員解析網頁內容、驗證數據正確性,進行網頁元素抓取等操作。

  5. 網頁數據轉換:通過解析網頁內容,Beautiful Soup 可以將網頁數據轉換為其他格式,如 JSON、CSV 等,用于數據導出和數據轉換。

優點:

  1. 簡單易用:Beautiful Soup 提供了簡單而直觀的 API,易于學習和使用,不需要深入了解 HTML 和 XML 的結構。

  2. 功能豐富:Beautiful Soup 支持解析 HTML 和 XML 文檔、文檔樹遍歷、元素搜索、內容提取等功能,滿足各種數據抓取和分析需求。

  3. 解析速度快:使用第三方解析器(如 lxml)可以提高解析速度,適用于大規模數據抓取和分析。

  4. 靈活性強:Beautiful Soup 支持多種解析器和定制化配置,可以根據具體需求進行靈活選擇和調整。

缺點:

  1. 解析效率低:相比于一些專門的解析庫(如 scrapy),Beautiful Soup 的解析效率相對較低,不適合處理大規模的數據抓取任務。

  2. 不支持異步解析:Beautiful Soup 不支持異步解析,無法充分利用異步編程模型的優勢,可能影響程序的性能和并發能力。

  3. 功能相對有限:雖然 Beautiful Soup 提供了豐富的功能和 API,但相比于一些專門的數據分析工具(如 pandas),其功能相對有限,不適合進行復雜的數據處理和分析。

????????總的來說,Beautiful Soup 是一個功能強大、簡單易用的 HTML 和 XML 解析庫,適用于各種數據抓取和數據分析場景,但在處理大規模數據和需要高性能的場景下可能存在一些限制。

二、安裝 Beautiful Soup

可以使用 pip 命令來安裝 Beautiful Soup:

pip install beautifulsoup4

三、解析器

????????解析器是 Beautiful Soup 中用于解析 HTML 或 XML 文檔的核心組件。Beautiful Soup 支持多種解析器,包括 Python 標準庫的解析器以及第三方解析器,如 lxml 和 html5lib。每種解析器都有其特點和適用場景,可以根據自己的需求選擇合適的解析器。

1、Python 標準庫解析器(html.parser)

????????Python 標準庫中的 html.parser 是一個基于 Python 實現的簡單解析器,速度適中,解析速度不如 lxml,但通常足夠應付一般的解析任務。它不需要安裝額外的庫,是 Beautiful Soup 的默認解析器。

from bs4 import BeautifulSoup# 使用 Python 標準庫解析器
soup = BeautifulSoup(html_doc, 'html.parser')

2、第三方解析器(lxml)

????????lxml 是一個非常快速且功能強大的 XML 解析器,它基于 libxml2 和 libxslt 庫,支持 XPath 查詢和 CSS 選擇器,解析速度比 Python 標準庫的解析器更快,通常推薦在性能要求較高的場景中使用。

from bs4 import BeautifulSoup# 使用 lxml 解析器
soup = BeautifulSoup(html_doc, 'lxml')

3、第三方解析器(html5lib)

????????html5lib 是一個基于 HTML5 規范的解析器,它會根據 HTML5 規范解析文檔,支持最新的 HTML5 元素和屬性,解析結果更加準確和穩定。但是,html5lib 的解析速度比較慢,通常在需要最高準確性和穩定性的情況下使用。

from bs4 import BeautifulSoup# 使用 html5lib 解析器
soup = BeautifulSoup(html_doc, 'html5lib')

4、如何選擇解析器

????????我們在選擇解析器時,需要考慮解析速度、內存占用、準確性和穩定性等因素。一般來說,如果對解析速度要求較高,可以選擇 lxml 解析器;如果對準確性和穩定性要求較高,可以選擇 html5lib 解析器;如果只是進行簡單的數據抓取,可以使用 Python 標準庫解析器。

四、文檔樹遍歷

????????文檔樹遍歷是 Beautiful Soup 中常用的操作之一,它允許以樹形結構遍歷 HTML 或 XML 文檔,訪問文檔中的各個節點、子節點、父節點等。

1、訪問節點

文檔樹中的每個元素都是一個節點,可以通過直接訪問節點來獲取元素的標簽名、屬性等信息。

# 獲取文檔樹的根節點
root = soup.html# 獲取節點的標簽名
print("Tag name:", root.name)# 獲取節點的屬性
print("Attributes:", root.attrs)

2、遍歷子節點

可以使用 .children 屬性來遍歷節點的子節點,它返回一個生成器,用于逐個訪問子節點。

# 遍歷子節點
for child in root.children:print(child)

3、遍歷子孫節點

可以使用 .descendants 屬性來遍歷節點的所有子孫節點,包括子節點、子節點的子節點等。

# 遍歷子孫節點
for descendant in root.descendants:print(descendant)

4、訪問父節點和祖先節點

可以使用 .parent 屬性來訪問節點的父節點,使用 .parents 屬性來遍歷節點的所有祖先節點。

# 訪問父節點
parent = root.parent# 遍歷祖先節點
for ancestor in root.parents:print(ancestor)

5、查找兄弟節點

可以使用 .next_sibling.previous_sibling 屬性來訪問節點的下一個兄弟節點和上一個兄弟節點。

# 訪問下一個兄弟節點
next_sibling = root.next_sibling# 訪問上一個兄弟節點
previous_sibling = root.previous_sibling

五、搜索元素

????????搜索元素是 Beautiful Soup 中非常常用的功能之一,它允許根據特定的條件來查找文檔中的元素,并提取所需的內容。

1、使用標簽名搜索

可以使用標簽名來搜索文檔中的元素,通過指定標簽名,可以獲取所有匹配的元素。

# 使用標簽名搜索
soup.find_all('div')  # 查找所有 div 元素

2、使用 CSS 類名搜索

可以使用 CSS 類名來搜索文檔中的元素,通過指定類名,可以獲取所有具有指定類名的元素。

# 使用 CSS 類名搜索
soup.find_all(class_='class-name')  # 查找所有具有指定類名的元素

3、使用 id 搜索

可以使用 id 來搜索文檔中的元素,通過指定 id,可以獲取具有指定 id 的元素。

# 使用 id 搜索
soup.find_all(id='content')  # 查找具有指定 id 的元素

4、使用正則表達式搜索

Beautiful Soup 還支持使用正則表達式來搜索文檔中的元素,通過指定正則表達式,可以匹配符合條件的元素。

import re# 使用正則表達式搜索
soup.find_all(re.compile('^b'))  # 查找所有以 'b' 開頭的元素

5、搜索嵌套元素

可以通過在搜索方法中傳入多個條件來搜索嵌套元素,這樣可以更精確地定位到目標元素。

# 搜索嵌套元素
soup.find_all('div', class_='class-name')  # 查找所有 class 為 class-name 的 div 元素

6、限制搜索結果數量

可以通過 limit 參數來限制搜索結果的數量,這樣可以節省內存和提高搜索速度。

# 限制搜索結果數量
soup.find_all('a', limit=10)  # 查找前 10 個 a 元素

六、提取內容

????????提取內容是 Beautiful Soup 中的核心功能之一,它允許從 HTML 或 XML 文檔中提取出所需的信息和內容。

1、提取文本內容

可以使用 .get_text() 方法來提取元素的文本內容,這將返回元素及其子孫節點中的所有文本內容,并將它們合并為一個字符串。

# 提取文本內容
text_content = soup.get_text()
print(text_content)

2、提取鏈接

可以使用 .get('href') 方法來提取鏈接元素(如 <a> 標簽)的鏈接地址。

# 提取鏈接
for link in soup.find_all('a'):print(link.get('href'))

3、提取圖片鏈接

可以使用 .get('src') 方法來提取圖片元素(如 <img> 標簽)的鏈接地址。

# 提取圖片鏈接
for img in soup.find_all('img'):print(img.get('src'))

4、提取屬性值

可以使用 .get() 方法來提取元素的任意屬性值,包括標簽的 class、id 等屬性。

# 提取屬性值
for element in soup.find_all('div'):print(element.get('class'))

5、提取特定標簽的內容

可以通過搜索特定的標簽來提取其內容,例如提取所有 <p> 標簽的文本內容。

# 提取特定標簽的內容
for paragraph in soup.find_all('p'):print(paragraph.get_text())

6、提取表格內容

可以通過搜索 <table> 標簽并遍歷其中的 <tr><td> 標簽來提取表格中的內容。

# 提取表格內容
for table in soup.find_all('table'):for row in table.find_all('tr'):for cell in row.find_all('td'):print(cell.get_text())

七、修改文檔

????????修改文檔是 Beautiful Soup 中的重要功能之一,它允許對解析后的文檔樹進行各種修改操作,包括添加、刪除、修改元素和屬性等。

1、添加元素

可以使用 .new_tag() 方法創建一個新的元素,然后使用 .append() 方法將其添加到文檔中。

# 創建新的元素
new_tag = soup.new_tag('div')
new_tag.string = 'New content'# 將新元素添加到文檔中
soup.body.append(new_tag)

2、刪除元素

可以使用 .decompose() 方法來刪除文檔中的元素,將其從文檔樹中移除。

# 查找需要刪除的元素
tag_to_delete = soup.find(id='content')# 刪除元素
tag_to_delete.decompose()

3、修改屬性

可以通過修改元素的屬性來改變元素的外觀和行為,例如修改元素的 class、id 等屬性。

# 查找需要修改屬性的元素
tag_to_modify = soup.find('a')# 修改屬性
tag_to_modify['href'] = 'http://www.example.com'

4、替換元素

可以使用 .replace_with() 方法來替換文檔中的元素,將一個元素替換為另一個元素。

# 創建新的元素
new_tag = soup.new_tag('span')
new_tag.string = 'Replacement content'# 查找需要替換的元素
tag_to_replace = soup.find(id='old-content')# 替換元素
tag_to_replace.replace_with(new_tag)

5、插入元素

可以使用 .insert() 方法在文檔中插入元素,將新元素插入到指定位置。

# 創建新的元素
new_tag = soup.new_tag('div')
new_tag.string = 'Inserted content'# 查找需要插入元素的位置
target_tag = soup.find(class_='container')# 插入元素
target_tag.insert(0, new_tag)  # 在指定位置插入元素

八、示例

from bs4 import BeautifulSoup# HTML 文檔內容
html_doc = """
<html>
<head><title>Example HTML Page</title>
</head>
<body><h1 class="heading">Beautiful Soup Example</h1><p>Welcome to <strong>Beautiful Soup</strong>!</p><a href="http://www.example.com">Example Link</a><a href="http://www.example.com/page1">Page 1</a><a href="http://www.example.com/page2">Page 2</a><div id="content"><p>This is some content.</p></div>
</body>
</html>
"""# 創建 Beautiful Soup 對象并指定解析器
soup = BeautifulSoup(html_doc, 'html.parser')# 1. 解析器
print("解析器:", soup.builder.NAME)# 2. 文檔樹遍歷
print("\n文檔樹遍歷:")
# 遍歷子節點
for child in soup.body.children:print(child)
# 遍歷子孫節點
for descendant in soup.body.descendants:print(descendant)# 3. 搜索元素
print("\n搜索元素:")
# 使用標簽名搜索
heading = soup.find('h1')
print("標簽名:", heading.name)
# 使用 CSS 類名搜索
heading = soup.find(class_='heading')
print("CSS 類名:", heading.name)
# 使用 id 搜索
content_div = soup.find(id='content')
print("id:", content_div.name)
# 使用正則表達式搜索
for tag in soup.find_all(re.compile('^a')):print("正則表達式:", tag.name)# 4. 提取內容
print("\n提取內容:")
# 提取文本內容
text_content = soup.get_text()
print("文本內容:", text_content)
# 提取鏈接
for link in soup.find_all('a'):print("鏈接:", link.get_text(), link.get('href'))
# 提取圖片鏈接
for img in soup.find_all('img'):print("圖片鏈接:", img.get('src'))# 5. 修改文檔
print("\n修改文檔:")
# 添加元素
new_tag = soup.new_tag('div')
new_tag.string = 'New content'
soup.body.append(new_tag)
print("添加元素后的文檔:", soup)
# 刪除元素
tag_to_delete = soup.find(id='content')
tag_to_delete.decompose()
print("刪除元素后的文檔:", soup)
# 修改屬性
heading = soup.find('h1')
heading['class'] = 'header'
print("修改屬性后的文檔:", soup)
# 替換元素
new_tag = soup.new_tag('span')
new_tag.string = 'Replacement content'
tag_to_replace = soup.find(id='old-content')
tag_to_replace.replace_with(new_tag)
print("替換元素后的文檔:", soup)
# 插入元素
new_tag = soup.new_tag('div')
new_tag.string = 'Inserted content'
target_tag = soup.find(class_='container')
target_tag.insert(0, new_tag)
print("插入元素后的文檔:", soup)

????????這個示例代碼涵蓋了 Beautiful Soup 的解析、搜索、提取、修改等功能,包括了解析器的選擇、文檔樹的遍歷、搜索元素、提取內容和修改文檔等方面。大家可以根據需要修改示例代碼,并嘗試在實際項目中應用 Beautiful Soup 進行數據抓取和分析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16224.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue項目打包教程

如果是用 vue-cli 創建的項目&#xff0c;則項目目錄中沒有 config 文件夾&#xff0c;所以我們需要自建一個配置文件&#xff1b;在vue項目目錄下創建文件 vue.config.js&#xff0c;需注意文件名稱必須是 vue.config.js&#xff0c;然后在文件中插入以下代碼&#xff1a; 文件…

我讓gpt4o給我推薦了一千多次書 得到了這些數據

事情是這樣的&#xff0c;我們公司不是有個讀書小組嘛&#xff0c;但是今年大家都忙于工作&#xff0c;忽視了讀書這件事&#xff0c;所以我就想著搞個群機器人&#xff0c;讓它明天定時向群里推薦一本書&#xff0c;用來喚起大家對讀書的興趣。但在調試的過程中就發現gpt4o老喜…

ACM實訓沖刺第十九天

第一套&#xff08;搞定&#xff09; #include<stdio.h> #include<string.h> int main(){int n;scanf("%d",&n);char s[100];getchar();for(int i0;i<n;i){gets(s);int cnta0,cnte0,cnti0,cnto0,cntu0;for(int i0;i<strlen(s);i){if(s[i]a){…

齒輪常見故障學習筆記

大家好&#xff0c;這期咱們聊一聊齒輪常見的失效形式&#xff0c;查閱了相關的資料&#xff0c;做個筆記分享給大家&#xff0c;共同學習。 介紹 齒輪故障可能以多種方式發生。如果在設計階段本身就盡量防止這些故障的產生&#xff0c;則可以產生改更為優化的齒輪設計。齒輪…

pytest框架用例命名規則詳解

pytest 測試用例的命名規則是為了確保 pytest 能夠正確地識別和執行測試用例。 以下是關于 pytest 測試用例命名規則的詳細解釋&#xff1a; 1 單個測試文件以‘test_’開頭或者以‘_test’結尾 比如我們創建test_case1.py case2_test.py文件。 2 單個測試文件中&#xff0c…

58. UE5 RPG AI行為樹的裝飾器

書接56. UE5 RPG 給敵人添加AI實現跟隨玩家&#xff0c;我們實現了AI一些基礎設置&#xff0c;并實現了獲取敵人附近的玩家實現了跟隨功能 接下來&#xff0c;我們將實現區分職業&#xff0c;并根據職業不同設置不同的攻擊距離&#xff0c;并且根據職業實現不同的技能施放。 …

《Effective Objective-C 2.0》讀書筆記——對象、消息、運行期

目錄 第二章&#xff1a;對象、消息、運行期第6條&#xff1a;理解“屬性”這一概念第7條&#xff1a;在對象內部盡量直接訪問實例變量第8條&#xff1a;理解“對象等同性”這一概念第9條&#xff1a;以“類族模式”隱藏實現細節第10條&#xff1a;在既有類中使用關聯對象存放自…

App推廣新境界:Xinstall助你輕松突破運營痛點,實現用戶快速增長!

在移動互聯網時代&#xff0c;App已經成為企業營銷不可或缺的一部分。然而&#xff0c;如何有效地推廣App&#xff0c;吸引并留住用戶&#xff0c;成為了眾多企業面臨的難題。今天&#xff0c;我們將為您揭秘一款神奇的App推廣工具——Xinstall&#xff0c;它將助您輕松突破運營…

繪唐3模型怎么放本地sd安裝及模型放置位置 及云端sd部署

繪唐3模型怎么放本地sd安裝及模型放置位置 及云端sd部署 資料里面授權方式&#xff1a; https://qvfbz6lhqnd.feishu.cn/wiki/CcaewIWnSiAFgokOwLycwi0Encf 云端和模型之間存在某種關聯性。云端通常用于存儲和管理大量數據&#xff0c;并提供計算和資源的服務。模型是對數據進…

Linux環境下TensorFlow安裝教程

TensorFlow是學習深度學習時常用的Python神經網絡框 下面以Mask R-CNN 的環境配置為例&#xff1a; 首先進入官網&#xff1a;www.tensorflow.org TensorFlow安裝的總界面&#xff1a; 新建anaconda虛擬環境&#xff1a; conda create -n envtf2 python3.8 &#xff08;Pyth…

『大模型筆記』從頭開始代碼構建GPT!

從頭開始代碼構建GPT! 文章目錄 一. 從頭開始代碼構建GPT!二. 參考文獻一. 從頭開始代碼構建GPT! 我們構建了一個生成式預訓練Transformer (GPT),遵循論文《Attention is All You Need》和OpenAI的GPT-2 / GPT-3的方法。我們討論了與ChatGPT的聯系,ChatGPT已經風靡全球。我…

Vue3學習-用 vite@latest 初始化項目后,引入模塊出現:找不到模塊 ‘@/***

引入模塊時遇到路徑錯誤 因為沒有默認配置別名&#xff0c;需要在 vite.config.ts 與 tsconfig.json 添加配置 //vite.config.ts export default defineConfig({resolve:{alias:{:path.resolve(__dirname,./src)}} })//tsconfig.json {"compilerOptions": {"b…

C# 為什么說LINQ要勝過SQL

C# 為什么說LINQ要勝過SQL 現在讓我簡潔地總結一下為什么說LINQ要勝過SQL的幾個主要原因&#xff1a; 統一編程語言&#xff1a; LINQ將查詢語言融合到編程語言中&#xff0c;使得查詢和其他業務邏輯可以在同一種編程語言中編寫&#xff0c;減少了在不同語言之間切換的復雜性&…

Vue | 自定義組件雙向綁定基礎用法

Vue | 自定義組件雙向綁定基礎用法 vue 中&#xff0c;由于單向數據流&#xff0c;常規的父子組件屬性更新&#xff0c;需要 在父組件綁定相應屬性&#xff0c;再綁定相應事件&#xff0c;事件里去做更新的操作&#xff0c;利用語法糖 可以減少綁定事件的操作。 這里就簡單的梳…

Qt 打卡小程序總結

1.Qt::Alignment&#xff08;枚舉類型&#xff09;用于指定控件或文本的對齊方式 Qt::AlignLeft&#xff1a;左對齊。Qt::AlignRight&#xff1a;右對齊。Qt::AlignHCenter&#xff1a;水平居中對齊。Qt::AlignTop&#xff1a;頂部對齊。Qt::AlignBottom&#xff1a;底部對齊。…

python表達式解析的陷阱與技巧

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、引言&#xff1a;表達式的復雜性 二、案例分析&#xff1a;表達式的解讀 三、陷阱揭示…

解決問題:Collecting package metadata (current_repodata.json)--faile

目錄 解決步驟&#xff1a; 1、創建pip.ini文件&#xff1a;winR對話框中復制輸入&#xff1a;%APPDATA%&#xff0c;然后回車。 2、conda添加清華源&#xff1a; 3、這些創建完&#xff0c;重啟電腦就可以創建你的虛擬環境了 4、利用鏡像源下載庫&#xff1a; 5、查看to…

AOP總結

AOP是什么 AOP是面向切面編程&#xff0c;其目的是將橫切關注點從核心業務代碼中分離出來&#xff0c;通過動態代理等方式&#xff0c;實現代碼的增強和解耦&#xff0c;使得其具有更好的可維護性和可擴展性。 其中橫切關注點是多個類或對象的公共行為&#xff0c;如事務管理…

2024寶藏工具EasyRecovery數據恢復軟件免費版本下載

在這個數字化的時代&#xff0c;數據已經成為我們生活中的重中之重。無論是工作中的重要文件&#xff0c;還是手機中珍貴的照片&#xff0c;我們都依賴著這些數據。然而&#xff0c;數據丟失的情況時有發生&#xff0c;可能是誤刪&#xff0c;可能是設備故障&#xff0c;更可能…

java-方法

在 Java 編程語言中&#xff0c;方法是一段用于執行特定任務的代碼。方法是面向對象編程&#xff08;OOP&#xff09;的基礎之一&#xff0c;因為它允許我們在對象上執行操作。在 Java 中&#xff0c;方法是類的組成部分&#xff0c;這意味著它們與類緊密相關。本解釋將涵蓋 Ja…