BeautifulSoup 庫的使用——python爬蟲

文章目錄

  • 寫在前面
  • python 爬蟲
    • BeautifulSoup庫是什么
    • BeautifulSoup的安裝
    • 解析器對比
    • BeautifulSoup的使用
      • BeautifulSoup 庫中的4種類
      • 獲取標簽
        • 獲取指定標簽
        • 獲取標簽的的子標簽
        • 獲取標簽的的父標簽(上行遍歷)
        • 獲取標簽的兄弟標簽(平行遍歷)
        • 獲取注釋
        • 根據條件查找標簽
        • 根據CSS選擇器查找標簽

寫在前面

本文主要介紹了python爬蟲中的BeautifulSoup庫的安裝和使用,如果是爬蟲小白,請先看文章爬蟲入門與requests庫的使用,再來看本文章,這樣你會有更深刻地理解,當然,大佬隨意。

python 爬蟲

BeautifulSoup庫是什么

BeautifulSoup是一個用于解析 HTMLXML 文檔的 Python 庫,它幫助你從網頁中提取數據。這個庫非常靈活,并且可以與多種不同的解析器一起工作,比如 Python 內置的 html.parserlxml 或者 html5lib

BeautifulSoup的安裝

想要安裝BeautifulSoup庫,則需要執行以下安裝命令:

  • pip install bs4
  • pip install beautifulsoup4
  • pip install soupsieve
  • pip install lxml

解析器對比

在這里插入圖片描述

如上圖,其中markup為一個html文件或者html代碼(字符串形式)。

BeautifulSoup的使用

BeautifulSoup 庫中的4種類

BeautifulSoup 將復雜的 HTML 文檔轉換成由 Python 對象構成的樹形結構,主要包括以下四種類型的對象:Tag, NavigableString, BeautifulSoup, 和 Comment

  • Tag:表示標簽。
  • NavigableString:表示標簽之間的文本內容。
  • BeautifulSoup:表示整個解析后的文檔。
  • Comment:一種特殊的 NavigableString,表示 HTML 中標簽之間的注釋。

獲取標簽

獲取指定標簽

Tag(獲取標簽):

from bs4 import BeautifulSoupwith open(file="test.html", mode='r', encoding='utf-8') as fp:soup = BeautifulSoup(markup=fp, features='html.parser')# 解析html文件并將解析結果返回# 查找并獲取HTML文檔中的第一個 <h2> 標簽。h2_tag = soup.h2# 打印找到的 <h2> 標簽(如果有的話)。如果沒有找到 <h2> 標簽,則打印None。print(h2_tag)# 打印 <h2> 標簽的數據類型。如果是有效的標簽,它將是bs4.element.Tag 類型;#如果沒有找到標簽,則是NoneType。print(type(h2_tag))# 打印標簽名 print(h2_tag.name) # 修改標簽名后打印,并不會修改原HTML文檔中的標簽名 h2_tag.name = 'h3' print(h2_tag.name)# 獲取標簽之間的文本內容(純文本內容),如果標簽中還有標簽,則返回None print(h1_tag.string) # 獲取標簽之間的文本內容,如果標簽中還有標簽,#則獲取所有二級標簽的內容(以換行分隔)# 最終將所有的文本內容拼接成一個字符串返回print(h1_tag.get_text())img_tag = soup.img    #獲取到第一個<img>標簽# 以字典方式獲取標簽的所有屬性的鍵和值print(img_tag.attrs)# 獲取img標簽中屬性alt的值,如果屬性不存在報KeyError錯誤print(img_tag['alt'])# 獲取img標簽中屬性alt的值,如果屬性不存在返回Noneprint(img_tag.get('alt'))print(img_tag.attrs.get('alt'))# 以上兩種方式是同樣的效果img_tag['alt'] = '修改后的alt'# 打印修改后的alt的值print(img_tag['alt'])# 刪除屬性del img_tag['alt']# 打印標簽內容print(img_tag)

下面詳細地講解一下需要注意的方法:

標簽名.get_text():

# 獲取標簽之間的文本內容,如果標簽中還有標簽,
# 則獲取所有二級標簽的文本內容(以換行分隔)
# 最終將所有的文本內容拼接成一個字符串返回print(h1_tag.get_text())
<div><p>Hello</p><span>World</span>
</div>
div_tag.get_text()          # 輸出: '\nHello\nWorld\n'
div_tag.get_text(strip=True) # 輸出: 'HelloWorld'
div_tag.get_text(separator=" | ") # 輸出: '\n | Hello | \n | World | \n'
獲取標簽的的子標簽
  1. 獲取指定標簽的所有子節點標簽及文本內容(列表形式返回)

標簽名.contents:

標簽名.contents#獲取當前標簽的直接子節點列表(不含子孫)
<div><p>Hello</p><span>World</span>
</div>
div_tag.contents 
# 輸出: ['\n', <p>Hello</p>, '\n', <span>World</span>, '\n']

在這里插入圖片描述

注意:與上面的標簽名.get_text()作區別

  1. 獲取指定標簽的所有子節點標簽及文本內容(迭代器形式返回)
soup.標簽名.children
#獲得標簽對應的子標簽和子字符串(回車)的迭代類型,可以直接用于迭代
  1. 獲取指定標簽的所有子孫后代節點標簽及文本內容(迭代器形式返回)
soup.標簽名.descendants
# 獲得標簽對應的所有的子孫標簽和子孫字符串的迭代類型,可以直接用于迭代
獲取標簽的的父標簽(上行遍歷)
  1. 獲取指定標簽的父標簽(迭代器形式返回)
soup.標簽名.parent
#獲得標簽對應的父標簽
  1. 獲取指定標簽的所有先輩標簽(迭代器形式返回),從直接父級開始,逐級向上到文檔根節點
soup.標簽名.parents#獲得標簽對應的先輩標簽的迭代類型,可以直接用于迭代
獲取標簽的兄弟標簽(平行遍歷)
  1. 獲取指定標簽相鄰的下一個平行標簽(按html代碼順序)
soup.標簽名.next_sibling  
#返回按html代碼順序的下一個平行節點標簽
  1. 獲取指定標簽相鄰的上一個平行標簽(按html代碼順序)
soup.標簽名.previous_sibling
# 返回html代碼順序的上一個平行節點標簽
  1. 獲取指定標簽后續的所有平行標簽(即按html代碼順序排在指定標簽后的所有兄弟標簽)
soup.標簽名.previous_siblings
# 返回html代碼順序的后續所有平行節點標簽
  1. 獲取指定標簽前序的所有平行標簽(即按html代碼順序排在指定標簽前的所有兄弟標簽)
soup.標簽名.previous_siblings 
#返回html代碼順序的前序所有平行節點標簽
獲取注釋

想要獲取和操作html文件或代碼中的注釋,需要通過 BeautifulSoupComment 類。

Comment類的作用;

  • 提取注釋內容:從 HTML/XML 中提取被 <!-- ... --> 包裹的注釋文本。
  • 判斷節點類型:識別某個字符串節點是否為注釋。

定位注釋:

注釋在 BeautifulSoup 中被解析為 Comment 類型的特殊字符串對象,可通過以下方式獲取:

from bs4 import BeautifulSoup, Commenthtml = '''
<div><p>正文內容</p><!-- 這是一個隱藏的注釋 -->
</div>
'''soup = BeautifulSoup(html, 'html.parser')# 方法1:遍歷所有字符串節點,篩選出注釋
comments = soup.find_all(string=lambda text: isinstance(text, Comment))
for comment in comments:print("注釋內容:", comment)  # 輸出: 這是一個隱藏的注釋# 方法2:直接通過標簽訪問(若注釋在標簽內)
div_tag = soup.div
comment_in_div = div_tag.find(string=lambda text: isinstance(text, Comment))
print(comment_in_div)  # 輸出: 這是一個隱藏的注釋

操作注釋:

  • 提取注釋文本:直接獲取 Comment 對象的字符串。
  • 替換或刪除注釋

# 找到對應的注釋
# 替換注釋為普通文本
comment = div_tag.find(string=lambda text: isinstance(text, Comment))
comment.replace_with("替換后的文本")# 刪除注釋
comment.extract()

例子( 提取注釋中的日期):

from bs4 import BeautifulSoup, Commenthtml = '''
<div class="article"><!-- 文章發布時間:2023-10-01 --><h1>標題</h1><p>正文內容...</p>
</div>
'''soup = BeautifulSoup(html, 'html.parser')
div_tag = soup.find('div', class_='article')
#定位到了指定的標簽# 查找注釋并提取日期
comment = div_tag.find(string=lambda text: isinstance(text, Comment))
if comment:date = comment.strip().split(":")[-1]print("發布日期:", date)  # 輸出: 2023-10-01
根據條件查找標簽
soup.find_all(name,attrs,string)#name 目的標簽名,同時查找多個標簽時格式為
#name=['標簽名1','標簽名2'],name=True時,查找出所有標簽#attrs 目的標簽中的屬性值,查找標簽名與name相同,同時標簽屬性的所有值中有attrs的標簽
#也可以直接對屬性進行查找 soup.find_all(class="title")
# 查找class屬性的值為"title"的標簽link = soup.find_all('a', {'class': 'sister', 'id': 'link2'})
#同時對多個屬性查找#string 對標簽文本內容的查找(支持使用正則表達)#limit 限制返回結果的數量,類似于 SQL 中的 `LIMIT` 關鍵字。
#當搜索到的結果數量達到限制時,停止搜索并返回結果#recursive 控制是否檢索所有子孫節點。
#如果設置為 `False`,則只搜索直接子節點#函數作用:以列表的形式返回查找結果
#soup(……) ----------soup.find_all(……)

如上,為常用的查找方法,其中soup.find()的作用是查找第一個匹配的標簽,找到后立馬返回,不再繼續查找,其參數與soup.find_all(……)相同。

根據CSS選擇器查找標簽

#可以直接使用標簽名查找元素
title_tags = soup.select('title')
print(title_tags)#使用(.類名)選擇類查找元素
sister_links = soup.select('.sister')
print(sister_links)#使用井號(`#id名`)選擇ID查找元素
link1 = soup.select('#link1')
print(link1)#使用空格選擇后代元素
bold_text = soup.select('p b')
print(bold_text)#使用大于號(`>子標簽名`)選擇直接子元素
direct_children = soup.select('body > p')
print(direct_children)  
# 輸出: [<p class="title"><b>The Dormouse's story</b></p>,
#<p class="story">...</p>]# 輸出body下所有子標簽中的p標簽#可以根據屬性來選擇元素
specific_link = soup.select('a[href="http://example.com/lacie"]') 
print(specific_link)#可以使用偽類選擇器,例如選擇第一個元素
first_sister = soup.select('.sister:first-child')
print(first_sister)
#選擇class="sister"的標簽下的第一個子標簽

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

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

相關文章

關于MacOS使用Homebrew的詳細介紹

Homebrew 是 macOS&#xff08;和 Linux&#xff09;上最流行的包管理工具&#xff08;Package Manager&#xff09;&#xff0c;用于快速安裝、更新和管理各種開發工具、命令行程序、開源軟件等。它類似于&#xff1a; Ubuntu/Debian 的 aptCentOS/RHEL 的 yumWindows 的 Cho…

最新扣子空間實操指南

一、首先要先獲取到內部測試的邀請碼&#xff0c; 我們先打開扣子空間官網&#xff1a;https://space.coze.cn/ 輸入邀請碼后進入該頁面&#xff1a; 它這里支持文件上傳&#xff0c;擴展里面有很多插件&#xff0c;頁支持MCP各種插件. 探索模式有兩種&#xff0c;一種是ai自…

ubuntu22.04安裝dukto

1.添加源 sudo add-apt-repository ppa:xuzhen666/dukto2.進行更新和安裝 sudo apt update sudo apt install dukto3.報錯 $ sudo apt install dukto 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹... 完成 正在讀取狀態信息... 完成 您也許需要…

Java編程基礎(第四篇:字符串初次介紹)

前言 HelloWorld寫的多了&#xff0c;語法熟悉一點了吧&#xff0c;其中有段代碼還沒介紹&#xff0c;它就是字符串 public class HelloWorld { public static void main(String[] args) { printBaby(); } static void printBaby() { System.out.print("baby"); } } …

安卓手機怎樣配置數據加速

利用系統自帶功能&#xff1a; 選擇網絡模式&#xff1a;進入手機 “設置”&#xff0c;找到 “網絡” 或 “移動網絡” 選項&#xff0c;點擊 “高級設置”&#xff0c;選擇合適的網絡模式&#xff0c;如優先選擇 4G 或 5G 網絡&#xff0c;以獲得更快的速度。開啟網絡加速功能…

Day3:個人中心頁面布局前端項目uniapp壁紙實戰

接下來我們來弄一下個人中心頁面布局user.vue <template><view class"userLayout"><view class"userInfo"><view class"avatar"><image src"../../static/Kx.jpg" mode"aspectFill"></im…

線性回歸之正則化(regularization)

文章目錄 機器學習中的"防過擬合神器"&#xff1a;正則化全解析1. 正則化&#xff1a;不只是"規矩"那么簡單1.1 魯棒性案例說明 2. L1正則化&#xff1a;冷酷的特征選擇器3. L2正則化&#xff1a;溫柔的約束者4. L1 vs L2&#xff1a;兄弟間的較量5. 正則化…

mapbox基礎,加載視頻到地圖

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??raster 柵格圖層 api二、??加載視頻到…

Linux系統的遠程終端登錄、遠程圖形桌面訪問、 X圖形窗口訪問

目錄 一、配置Ubuntu系統的網絡和用戶 1、設置虛擬機網絡為橋接模式 2.查看當前ip、子網掩碼、網關 3.修改配置文件 二、遠程終端登錄Ubuntu 三、使用XShell遠程連接 1、確保SSH服務已啟動 2、檢查SSH服務狀態 3、獲取樹莓派IP地址 4、Xming安裝好之后打開讓它在后臺…

多模態大語言模型arxiv論文略讀(三十一)

From GPT-4 to Gemini and Beyond: Assessing the Landscape of MLLMs on Generalizability, Trustworthiness and Causality through Four Modalities ?? 論文標題&#xff1a;From GPT-4 to Gemini and Beyond: Assessing the Landscape of MLLMs on Generalizability, Tr…

基于Matlab求解矩陣電容等效容值

1需求 仿真測試8*10階舉證電容等效容值。 2模型搭建 2.1打開simscape 在打開simulink之后打開simscape庫&#xff0c;Simscape庫位置如下 2.2搭建模型 在庫中尋找需要的元件搭建電路。 2.2.1基本元件 電阻電容電感等基礎器件&#xff0c;搭建電路之后需要對其進行幅值&…

【C++】 —— 筆試刷題day_22

一、添加字符 題目解析 這道題&#xff0c;給定兩個字符串A和B&#xff0c;字符串A的長度要小于B的長度&#xff1b; 現在我們要對A字符串添加字符&#xff0c;使得A字符串長度等于B字符串的長度&#xff0c;并且要求對應位置的字母盡量相等&#xff0c;然后求出來不相等的字符…

錯誤: 找不到或無法加載主類 HelloWorld,cmd窗口,java命令,提示

錯誤: 找不到或無法加載主類 HelloWorld 解決辦法 檢查classpath是否 .; 開頭的

手撕LLM(五):從源碼出發,探索多模態VL模型的推理全流程

前面我們分享了關于大語言模型的相關技術&#xff0c;包括前向推理、LoRa掛載、MoE模型、模型預訓練等&#xff1b;后續還是會基于MiniMindLM模型繼續分享關于大語言模型的SFT指令微調、LoRa微調、基于人類偏好的強化學習微調以及模型蒸餾相關的技術&#xff0c;請大家持續關注…

關于隔離2:ADC芯片

ADC可以稱作是模擬芯片領域的明珠。作為一種關鍵器件&#xff0c;ADC設計難度大&#xff0c;專利墻高&#xff0c;所以國內一直處于追趕的狀態。近年來&#xff0c;國產ADC發展極為迅速&#xff0c;逐漸在各項參數上趕上了國際主流水準。 模擬數字轉換器ADC連接著現實模擬世界…

【MySQL】前綴索引、索引下推、訪問方法,自適應哈希索引

最左前綴原則 對于INDEX(name, age)來說最左前綴可以是聯合索引的最左N個字段, 也可以是字符串索引的最左M個字符。 SELECT * FROM t WHERE name LIKE 張%其效果和單獨創建一個INDEX(name)的效果是一樣的若通過調整索引字段的順序, 可以少維護一個索引樹, 那么這個順序就是需要…

【Oracle專欄】Oracle中的虛擬列

Oracle相關文檔&#xff0c;希望互相學習&#xff0c;共同進步 風123456789&#xff5e;-CSDN博客 1.背景 在EXP方式導出時&#xff0c;發現 出現如下提示 EXP-00107: virtual column 不支持&#xff0c;因此采用expdp方式導出。于是本文針對oracle虛擬列進行簡單介紹。 2. 相…

Nacos深度剖析與實踐應用之-配置中心

&#x1f4f9; 簡介 在微服務架構中&#xff0c;配置管理是至關重要的基礎能力。Nacos作為阿里巴巴開源的一體化動態服務發現、配置管理和服務管理平臺&#xff0c;其配置中心模塊提供了統一配置管理、動態配置推送、多環境支持等核心能力。相比傳統配置文件方式&#xff0c;Na…

gma 2.1.4 (2025.04.18) | GmaGIS V0.0.1a3 更新日志

安裝 gma 2.1.4 pip install gma2.1.4網盤下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取碼&#xff1a;1pc8 注意&#xff1a;此版本沒有Linux版&#xff01; 編譯gma的Linux虛擬機沒有時間修復&#xff0c;本期Linux版繼…

在 Node.js 中設置響應的 MIME 類型

在 Node.js 中設置響應的 MIME 類型是為了讓瀏覽器正確解析服務器返回的內容&#xff0c;比如 HTML、CSS、圖片、JSON 等。我們通常通過設置響應頭中的 Content-Type 字段來完成。 ? 一、什么是 MIME 類型&#xff08;Content-Type&#xff09;&#xff1f; MIME&#xff08;…