Python 爬蟲 – BeautifulSoup

Python 爬蟲(Web Scraping)是指通過編寫 Python 程序從互聯網上自動提取信息的過程。

爬蟲的基本流程通常包括發送 HTTP 請求獲取網頁內容、解析網頁并提取數據,然后存儲數據。

Python 的豐富生態使其成為開發爬蟲的熱門語言,特別是由于其強大的庫支持。

一般來說,爬蟲的流程可以分為以下幾個步驟:

  • 發送 HTTP 請求:爬蟲通過 HTTP 請求從目標網站獲取 HTML 頁面,常用的庫包括 [requests](https://www.runoob.com/python3/python-requests.html)
  • 解析 HTML 內容:獲取 HTML 頁面后,爬蟲需要解析內容并提取數據,常用的庫有 BeautifulSouplxmlScrapy 等。
  • 提取數據:通過定位 HTML 元素(如標簽、屬性、類名等)來提取所需的數據。
  • 存儲數據:將提取的數據存儲到數據庫、CSV 文件、JSON 文件等格式中,以便后續使用或分析。

本章節主要介紹 BeautifulSoup,它是一個用于解析 HTML 和 XML 文檔的 Python 庫,能夠從網頁中提取數據,常用于網頁抓取和數據挖掘。


BeautifulSoup

BeautifulSoup 是一個用于從網頁中提取數據的 Python 庫,特別適用于解析 HTML 和 XML 文件。

BeautifulSoup 能夠通過提供簡單的 API 來提取和操作網頁中的內容,非常適合用于網頁抓取和數據提取的任務。

安裝 BeautifulSoup

要使用 BeautifulSoup,需要安裝 beautifulsoup4 和 lxml 或 html.parser(一個 HTML 解析器)。

我們可以使用 pip 來安裝這些依賴:

pip install beautifulsoup4
pip install lxml  # 推薦使用 lxml 作為解析器(速度更快)

如果你沒有 lxml,可以使用 Python 內置的 html.parser 作為解析器。

基本用法

BeautifulSoup 用于解析 HTML 或 XML 數據,并提供了一些方法來導航、搜索和修改解析樹。

BeautifulSoup 常見的操作包括查找標簽、獲取標簽屬性、提取文本等。

要使用 BeautifulSoup,需要先導入 BeautifulSoup,并將 HTML 頁面加載到 BeautifulSoup 對象中。

通常,你會先用爬蟲庫(如 requests)獲取網頁內容:

實例

from bs4 import BeautifulSoup
import requests

# 使用 requests 獲取網頁內容
url = ‘https://cn.bing.com/’ # 抓取bing搜索引擎的網頁內容
response = requests.get(url)

# 使用 BeautifulSoup 解析網頁
soup = BeautifulSoup(response.text, ‘lxml’) # 使用 lxml 解析器
# 解析網頁內容 html.parser 解析器
# soup = BeautifulSoup(response.text, ‘html.parser’)

獲取網頁標題:

實例

from bs4 import BeautifulSoup
import requests

# 指定你想要獲取標題的網站
url = ‘https://cn.bing.com/’ # 抓取bing搜索引擎的網頁內容

# 發送HTTP請求獲取網頁內容
response = requests.get(url)
# 中文亂碼問題
response.encoding = ‘utf-8’
# 確保請求成功
if response.status_code == 200:
# 使用BeautifulSoup解析網頁內容
soup = BeautifulSoup(response.text, ‘lxml’)

    \# 查找<title>標簽  
title\_tag \= soup.find('title')\# 打印標題文本  
if title\_tag:  print(title\_tag.get\_text())  
else:  print("未找到<title>標簽")  

else:
print(“請求失敗,狀態碼:”, response.status_code)

執行以上代碼,輸出標題為:

搜索 - Microsoft 必應

中文亂碼問題

使用 requests 庫抓取中文網頁時,可能會遇到編碼問題,導致中文內容無法正確顯示,為了確保能夠正確抓取并顯示中文網頁,通常需要處理網頁的字符編碼。

自動檢測編碼 requests 通常會自動根據響應頭中的 Content-Type 來推測網頁的編碼,但有時可能不準確,此時可以使用 chardet 來自動檢測編碼。

實例

import requests

url = ‘https://cn.bing.com/’
response = requests.get(url)

# 使用 chardet 自動檢測編碼
import chardet
encoding = chardet.detect(response.content)[‘encoding’]
print(encoding)
response.encoding = encoding

執行以上代碼,輸出為:

utf-8

如果你知道網頁的編碼(例如 utf-8 或 gbk),可以直接設置 response.encoding:

response.encoding = 'utf-8'  # 或者 'gbk',根據實際情況選擇

查找標簽

BeautifulSoup 提供了多種方法來查找網頁中的標簽,最常用的包括 find() 和 find_all()。

  • find() 返回第一個匹配的標簽
  • find_all() 返回所有匹配的標簽

實例

from bs4 import BeautifulSoup
import requests

# 指定你想要獲取標題的網站
url = ‘https://www.baidu.com/’ # 抓取bing搜索引擎的網頁內容

# 發送HTTP請求獲取網頁內容
response = requests.get(url)
# 中文亂碼問題
response.encoding = ‘utf-8’

soup = BeautifulSoup(response.text, ‘lxml’)

# 查找第一個 標簽
first_link = soup.find(‘a’)
print(first_link)
print(“----------------------------”)

# 獲取第一個 標簽的 href 屬性
first_link_url = first_link.get(‘href’)
print(first_link_url)
print(“----------------------------”)

# 查找所有 標簽
all_links = soup.find_all(‘a’)
print(all_links)

輸出結果類似如下:

<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新聞</a>
----------------------------
http://news.baidu.com
----------------------------
[<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新聞</a>, <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a>, <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地圖</a>, <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">視頻</a>,

獲取標簽的文本

通過 get_text() 方法,你可以提取標簽中的文本內容:

實例

from bs4 import BeautifulSoup
import requests

# 指定你想要獲取標題的網站
url = ‘https://www.baidu.com/’ # 抓取bing搜索引擎的網頁內容

# 發送HTTP請求獲取網頁內容
response = requests.get(url)
# 中文亂碼問題
response.encoding = ‘utf-8’

soup = BeautifulSoup(response.text, ‘lxml’)

# 獲取第一個

標簽中的文本內容
paragraph_text = soup.find(‘p’).get_text()

# 獲取頁面中所有文本內容
all_text = soup.get_text()
print(all_text)

輸出結果類似如下:

 百度一下,你就知道           
...

查找子標簽和父標簽

你可以通過 parent 和 children 屬性訪問標簽的父標簽和子標簽:

# 獲取當前標簽的父標簽
parent_tag = first_link.parent# 獲取當前標簽的所有子標簽
children = first_link.children

實例

from bs4 import BeautifulSoup
import requests

# 指定你想要獲取標題的網站
url = ‘https://www.baidu.com/’ # 抓取bing搜索引擎的網頁內容

# 發送HTTP請求獲取網頁內容
response = requests.get(url)
# 中文亂碼問題
response.encoding = ‘utf-8’

soup = BeautifulSoup(response.text, ‘lxml’)

# 查找第一個 標簽
first_link = soup.find(‘a’)
print(first_link)
print(“----------------------------”)

# 獲取當前標簽的父標簽
parent_tag = first_link.parent
print(parent_tag.get_text())

輸出結果類似如下:

<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新聞</a>
----------------------------新聞 hao123 地圖 視頻 貼吧  登錄   更多產品 

查找具有特定屬性的標簽

你可以通過傳遞屬性來查找具有特定屬性的標簽。

例如,查找類名為 example-class 的所有 div 標簽:

# 查找所有 class="example-class" 的 <div> 標簽
divs_with_class = soup.find_all('div', class_='example-class')# 查找具有 id="unique-id" 的 <p> 標簽
unique_paragraph = soup.find('p', id='unique-id')

獲取搜索按鈕,id 為 su :

實例

from bs4 import BeautifulSoup
import requests

# 指定你想要獲取標題的網站
url = ‘https://www.baidu.com/’ # 抓取bing搜索引擎的網頁內容

# 發送HTTP請求獲取網頁內容
response = requests.get(url)
# 中文亂碼問題
response.encoding = ‘utf-8’

soup = BeautifulSoup(response.text, ‘lxml’)

# 查找具有 id=“unique-id” 的 標簽
unique_input = soup.find(‘input’, id=‘su’)

input_value = unique_input[‘value’] # 獲取 input 輸入框的值

print(input_value)

輸出結果為:

百度一下

高級用法

CSS 選擇器

BeautifulSoup 也支持通過 CSS 選擇器來查找標簽。

select() 方法允許使用類似 jQuery 的選擇器語法來查找標簽:

# 使用 CSS 選擇器查找所有 class 為 'example' 的 <div> 標簽
example_divs = soup.select('div.example')# 查找所有 <a> 標簽中的 href 屬性
links = soup.select('a[href]')

處理嵌套標簽

BeautifulSoup 支持深度嵌套的 HTML 結構,你可以通過遞歸查找子標簽來處理這些結構:

# 查找嵌套的 <div> 標簽
nested_divs = soup.find_all('div', class_='nested')
for div in nested_divs:print(div.get_text())

修改網頁內容

BeautifulSoup 允許你修改 HTML 內容。

我們可以修改標簽的屬性、文本或刪除標簽:

實例

# 修改第一個 標簽的 href 屬性
first_link[‘href’] = ‘http://new-url.com’

# 修改第一個

標簽的文本內容
first_paragraph = soup.find(‘p’)
first_paragraph.string = ‘Updated content’

# 刪除某個標簽
first_paragraph.decompose()

轉換為字符串

你可以將解析的 BeautifulSoup 對象轉換回 HTML 字符串:

# 轉換為字符串
html_str = str(soup)

BeautifulSoup 屬性與方法

以下是 BeautifulSoup 中常用的屬性和方法:

方法/屬性描述示例
BeautifulSoup()用于解析 HTML 或 XML 文檔并返回一個 BeautifulSoup 對象。soup = BeautifulSoup(html_doc, 'html.parser')
.prettify()格式化并美化文檔內容,生成結構化的字符串。print(soup.prettify())
.find()查找第一個匹配的標簽。tag = soup.find('a')
.find_all()查找所有匹配的標簽,返回一個列表。tags = soup.find_all('a')
.find_all_next()查找當前標簽后所有符合條件的標簽。tags = soup.find('div').find_all_next('p')
.find_all_previous()查找當前標簽前所有符合條件的標簽。tags = soup.find('div').find_all_previous('p')
.find_parent()返回當前標簽的父標簽。parent = tag.find_parent()
.find_all_parents()查找當前標簽的所有父標簽。parents = tag.find_all_parents()
.find_next_sibling()查找當前標簽的下一個兄弟標簽。next_sibling = tag.find_next_sibling()
.find_previous_sibling()查找當前標簽的前一個兄弟標簽。prev_sibling = tag.find_previous_sibling()
.parent獲取當前標簽的父標簽。parent = tag.parent
.next_sibling獲取當前標簽的下一個兄弟標簽。next_sibling = tag.next_sibling
.previous_sibling獲取當前標簽的前一個兄弟標簽。prev_sibling = tag.previous_sibling
.get_text()提取標簽內的文本內容,忽略所有HTML標簽。text = tag.get_text()
.attrs返回標簽的所有屬性,以字典形式表示。href = tag.attrs['href']
.string獲取標簽內的字符串內容。string_content = tag.string
.name返回標簽的名稱。tag_name = tag.name
.contents返回標簽的所有子元素,以列表形式返回。children = tag.contents
.descendants返回標簽的所有后代元素,生成器形式。for child in tag.descendants: print(child)
.parent獲取當前標簽的父標簽。parent = tag.parent
.previous_element獲取當前標簽的前一個元素(不包括文本)。prev_elem = tag.previous_element
.next_element獲取當前標簽的下一個元素(不包括文本)。next_elem = tag.next_element
.decompose()從樹中刪除當前標簽及其內容。tag.decompose()
.unwrap()移除標簽本身,只保留其子內容。tag.unwrap()
.insert()向標簽內插入新標簽或文本。tag.insert(0, new_tag)
.insert_before()在當前標簽前插入新標簽。tag.insert_before(new_tag)
.insert_after()在當前標簽后插入新標簽。tag.insert_after(new_tag)
.extract()刪除標簽并返回該標簽。extracted_tag = tag.extract()
.replace_with()替換當前標簽及其內容。tag.replace_with(new_tag)
.has_attr()檢查標簽是否有指定的屬性。if tag.has_attr('href'):
.get()獲取指定屬性的值。href = tag.get('href')
.clear()清空標簽的所有內容。tag.clear()
.encode()編碼標簽內容為字節流。encoded = tag.encode()
.is_empty_element檢查標簽是否是空元素(例如 <br><img> 等)。if tag.is_empty_element:
.is_ancestor_of()檢查當前標簽是否是指定標簽的祖先元素。if tag.is_ancestor_of(another_tag):
.is_descendant_of()檢查當前標簽是否是指定標簽的后代元素。if tag.is_descendant_of(another_tag):

其他屬性

方法/屬性描述示例
.style獲取標簽的內聯樣式。style = tag['style']
.id獲取標簽的 id 屬性。id = tag['id']
.class_獲取標簽的 class 屬性。class_name = tag['class']
.string獲取標簽內部的字符串內容,忽略其他標簽。content = tag.string
.parent獲取標簽的父元素。parent = tag.parent

其他

方法/屬性描述示例
find_all(string)使用字符串查找匹配的標簽。tag = soup.find_all('div', class_='container')
find_all(id)查找指定 id 的標簽。tag = soup.find_all(id='main')
find_all(attrs)查找具有指定屬性的標簽。tag = soup.find_all(attrs={"href": "http://example.com"})

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

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

相關文章

圖像分類項目1:基于卷積神經網絡的動物圖像分類

一、選題背景及動機 在現代社會中&#xff0c;圖像分類是計算機視覺領域的一個重要任務。動物圖像分類具有廣泛的應用&#xff0c;例如生態學研究、動物保護、農業監測等。通過對動物圖像進行自動分類&#xff0c;可以幫助人們更好地了解動物種類、數量和分布情況&#xff0c;…

物聯網 智慧園區井蓋管理辦法和功能介紹

在園區內實現 智慧井蓋 的定位、內部氣體檢測和紅外監測等頂級功能&#xff0c;可以顯著提升園區的安全管理水平和運維效率。以下是智慧井蓋系統的詳細設計方案和功能實現&#xff1a; 一、系統架構 智慧井蓋系統可以分為以下層次&#xff1a; 1. 感知層 定位模塊&#xff1…

零基礎deep seek+剪映,如何制作高品質的視頻短片

以下是專為零基礎學習者設計的 剪映專業版詳細教程&#xff0b;Deep seek配合制 &#xff0c;包含從入門到精通的系統化教學&#xff0c;配合具體操作步驟與實用技巧&#xff1a; 基于DeepSeek與剪映協同制作高品質視頻短片的專業流程指南&#xff08;2025年最新實踐版&#x…

PHP:IDEA開發工具配置XDebug,斷點調試

文章目錄 一、php.ini配置二、IDEA配置 一、php.ini配置 [xdebug] zend_extension"F:\wamp64\bin\php\php7.4.0\ext\php_xdebug-2.8.0-7.4-vc15-x86_64.dll" xdebug.remote_enable on xdebug.remote_host 127.0.0.1 xdebug.remote_port 9001 xdebug.idekey"…

改進YOLOv8模型的空間注意力機制研究:RFAConv的貢獻與實現

文章目錄 1. 背景介紹2. 什么是RFAConv?3. YOLOv8中的RFAConv實現3.1 RFAConv模塊設計3.2 在YOLOv8中集成RFAConv4. 性能對比與實驗結果4.1 實驗設置4.2 實驗結果5. 模型優化與調優5.1 調整RFAConv模塊的超參數5.2 數據增強策略5.3 更深層的注意力機制5.4 混合卷積與優化計算圖…

【Java】使用jdk自帶的zip壓縮實現任意文件壓縮打包下載功能(復制即用)

前言 在實際項目中&#xff0c;我們可能會接到將文件或者資料打包壓縮導出的需求&#xff0c;例如將系統中某些生成的文件一起打包壓縮下載提供給客戶使用&#xff0c;今天提供一個jdk自帶的工具類快速實現打包壓縮的功能&#xff0c;方法我已經封裝好&#xff0c;大家如果在項…

騰訊云擴容記錄

騰訊云擴容&#xff1a; sudo yum install -y cloud-utils-growpart 安裝擴容工具 sudo file -s /dev/vda1 有數據 sudo LC_ALLen_US.UTF-8 growpart /dev/vda 1 sudo resize2fs /dev/vda1 df -Th 完畢 以下是對執行的命令的詳細解釋以及背后的原理&#xff1a; 1. 安裝 cloud…

服務流程設計和服務或端口重定向及其websocket等應用示例

服務流程設計和服務或端口重定向及其websocket等應用示例 目錄 服務或端口重定向的服務設計和websocket等應用示例 一、通用請求控制流程 1.1、入口 1.2、所有GET請求首先預檢控制單元 1.3、http請求會分別自動307重定向 1.4、所有請求首先執行跨源控制單元 1.5、然后…

PHP面試題--后端部分

本文章持續更新內容 之前沒來得及整理時間問題導致每次都得找和重新背 這次整理下也方便各位小伙伴一起更輕松的一起踏入編程之路 歡迎各位關注博主不定期更新各種高質量內容適合小白及其初級水平同學一起學習 一起成為大佬 數組函數有那些 ps&#xff1a;本題挑難的背因為…

深入了解 MySQL 中的 JSON_CONTAINS

深入了解 MySQL 中的 JSON_CONTAINS MySQL 5.7 及更高版本引入了對 JSON 數據類型的支持&#xff0c;使得在數據庫中存儲和查詢 JSON 數據成為可能。在這些新功能中&#xff0c;JSON_CONTAINS 函數是一個非常有用的工具&#xff0c;允許我們檢查一個 JSON 文檔是否包含特定的值…

git命令學習記錄

1. git reset 參數說明 git reset 是用來回退版本的&#xff0c;它可以添加三個參數&#xff0c;常用的使用格式是這樣的&#xff1a;git reset [--hard | --soft | --mixed] 版本號 一般使用git修改文件并提交需要三步&#xff0c;第一步在文本編輯器中編輯文件&#xff0c;也…

使用DeepSeek+KIMI生成高質量PPT

一、使用DeepSeek DeepSeek官網&#xff1a;DeepSeek 點擊“開始對話”&#xff0c;進入交互頁面。 在上圖中&#xff0c;輸入問題&#xff0c;即可獲取AI生成的結果。 基礎模型&#xff08;V3&#xff09;&#xff1a;通用模型&#xff08;2024.12&#xff09;&#xff0c;高…

深度學習工程師的技術圖譜和學習路徑

在構建一個深度學習工程師的技術圖譜時,按照“技能樹與能力模型”的結構可以幫助清晰地展示出技術體系的層次化關系,幫助學習者更好地理解每個技術點的依賴與順序。 深度學習工程師的技術圖譜和學習路徑 以下是深度學習工程師的技能樹,包括從基礎到進階的學習路徑,以及對…

RabbitMQ系列(五)基本概念之Queue

在 RabbitMQ 中&#xff0c;Queue&#xff08;隊列&#xff09; 是存儲消息的容器&#xff0c;也是消息傳遞的核心載體。以下是其核心特性與作用的全方位解析&#xff1a; 一、Queue 的定義與核心作用 消息存儲容器 Queue 是 RabbitMQ 中實際存儲消息的實體&#xff0c;生產者…

MySQL—使用binlog日志恢復數據

一、binlog日志恢復數據簡介 在 MySQL 中&#xff0c;使用二進制日志&#xff08;binlog&#xff09;恢復數據是一種常見的用于故障恢復或數據找回的方法。以下是詳細的使用步驟&#xff1a; 確認 binlog 已啟用&#xff1a;首先需要確認 MySQL 服務器已經啟用了二進制日志功…

VADv2: 基于矢量表征和概率規劃的E2E架構

1. 寫在前面 今天分享一篇自動駕駛領域的論文VADv2(End-to-End Vectorized Autonomous Driving via Probabilistic Planning), 基于矢量表征和概率規劃的E2E架構,2024年2月份華中科技大和地平線合作的一篇文章, 在經典的端到端模型架構上作出了基于概率規劃去輸出規劃軌跡的…

NLP11-命名實體識別(NER)概述

目錄 一、序列標注任務 常見子任務 二、 命名實體識別&#xff08;NER&#xff09; &#xff08;一&#xff09;簡介 &#xff08;二&#xff09;目標 &#xff08;三&#xff09;應用場景 &#xff08;四&#xff09;基本方法 &#xff08;五&#xff09;工具與資源 一…

虛擬仿真無線路由器5G和2.4G發射信號輻射對比(虛擬仿真得出最小安全距離,與國際標準要求一致)

1、前言 有人說&#xff0c;只要有電磁波的地方就有輻射。5G和2.4G信號輻射強度是多少&#xff1f;是否會對人體構成危害&#xff1f;無線路由器的2.4GHz頻段&#xff0c;頻率范圍&#xff1a;2.4 GHz 至 2.4835 GHz&#xff0c;信道寬度&#xff1a;通常為20 MHz&#xff0c;…

深入剖析 OpenCV:全面掌握基礎操作、圖像處理算法與特征匹配

深入剖析 OpenCV&#xff1a;全面掌握基礎操作、圖像處理算法與特征匹配 一、引言二、OpenCV 的安裝&#xff08;一&#xff09;使用 pip 安裝&#xff08;二&#xff09;使用 Anaconda 安裝 三、OpenCV 基礎操作&#xff08;一&#xff09;圖像的讀取、顯示與保存&#xff08;…

DOM HTML:深入理解與高效運用

DOM HTML:深入理解與高效運用 引言 隨著互聯網的飛速發展,前端技術逐漸成為軟件開發中的關鍵部分。DOM(文檔對象模型)和HTML(超文本標記語言)是前端開發中的基石。本文將深入探討DOM和HTML的概念、特性以及在實際開發中的應用,幫助讀者更好地理解和使用這兩項技術。 …