Python爬蟲之簡單學習BeautifulSoup庫,學習獲取的對象常用方法,實戰豆瓣Top250

BeautifulSoup是一個非常流行的Python庫,廣泛應用于網絡爬蟲開發中,用于解析HTML和XML文檔,以便于從中提取所需數據。它是進行網頁內容抓取和數據挖掘的強大工具。

功能特性

  1. 易于使用: 提供簡潔的API,使得即使是對網頁結構不熟悉的開發者也能快速上手。
  2. 文檔解析: 支持多種解析器,包括Python標準庫中的HTML解析器以及第三方的lxml解析器,后者速度更快且功能更強大。
  3. 自動編碼識別: 自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為UTF-8編碼,簡化了編碼處理的復雜性。
  4. 導航與搜索: 提供了豐富的選擇器和方法,如 .find(), .find_all(), .select() 等,便于按標簽名、屬性、類名等查找元素。
  5. 數據提取: 可以輕松地提取和修改HTML或XML文檔中的數據,支持遍歷和搜索DOM樹,提取文本、屬性等信息。
  6. 靈活的輸出格式: 可以將解析后的數據輸出為Python對象、字符串或者保存為文件。

目錄

安裝BeautifulSoup

基本使用

BeautifulSoup獲取對象

選擇器

1、CSS選擇器(select()方法):

2、Tag名:

3、屬性選擇:

方法

.find_all()

.find()

示例

使用BeautifulSoup爬取豆瓣Top250實例


安裝BeautifulSoup

在命令窗口安裝

pip install

基本使用

我們使用requests庫發送請求獲取html,獲得的是html字符串,在爬蟲中,只有正則表達式(re)才可以直接對html字符串進行解析,而對于html字符串我們無法使用xpath語法和bs4語法進行直接提取,需要通過lxml或者bs4對html字符串進行解析,解析為html頁面才能進行數據提取。

在xpath中我們使用lxml進行解析,但是在bs4中,我們有很多的解析器對網頁進行解析。

這里我們只說一種最常用最簡單的解析器"html.parser"

簡單來說BeautifulSoup是一個從html字符串提取數據的工具,使用BeautifulSoup分為三步:
第一步 導入BeautifulSoup類,抓取網頁同時也導入requests庫

from bs4 import BeautifulSoup
import requests

第二步 傳遞初始化參數(HTML代碼,HTML解析器),并初始化

這里解析器使用'html.parser',這是python自帶的解析器,更方便使用

# html_code:html代碼  html.parser:解析器,python自帶的解析器
soup = BeautifulSoup(html_code, 'html.parser')

第三步 獲取實例對象,操作對象獲取數據

BeautifulSoup獲取對象可以使用選擇器和方法。

BeautifulSoup獲取對象

選擇器

1、CSS選擇器(select()方法):

支持ID選擇器、類選擇器、屬性選擇器、偽類等

復雜選擇

  • 組合選擇器:可以使用逗號 , 分隔多個選擇器來選擇多個不同類型的元素。
  • 后代選擇器:使用空格表示,如 .story a 選取所有.story類內的<a>標簽。
  • 子選擇器:使用 > 表示直接子元素,如 body > p 選取<body>直接下的所有段落。
  • 屬性選擇器:如 [href*=example] 選取所有href屬性包含"example"的元素。
  • 偽類選擇器:如 a:hover、:first-child 等,雖然不是所有CSS偽類在BeautifulSoup中都可用,但一些基本的如:first-child, :last-child等有時也能派上用場。

2、Tag名:

  • 直接使用tag名作為屬性,如 soup.div 返回第一個<div>標簽。
  • 支持通過列表索引來定位特定的標簽,如 soup.divs[0]。

3、屬性選擇:

使用[attribute=value]語法,例如 soup.find_all(attrs={'class': 'active'}) 查找所有class為"active"的元素。

方法

.find_all()

查找文檔中所有匹配指定條件的tag,返回一個列表。

參數可以精確指定tag名字、屬性、文本內容等。

.find()

類似于.find_all(),但只返回第一個匹配的元素。

示例

1、獲取所有div標簽

soup.find_all('div')

2、獲取擁有指定屬性的標簽(id='even'的div標簽)

soup.find_all('div', id='even')

如果有多個屬性的標簽,可以使用字典模式

soup.find_all('div', attrs={"id":"even", "class":"cc"})
soup.find_all('div', id='even',class_='c')

使用字典形式,還可以添加樣式屬性,更加靈活

3、獲取標簽的屬性值

方法1:通過下標方式提取

alist = soup.find_all('a')
# 我想獲取a標簽的href值
for a in alist:href = a['href']print(href)

方法2:利用attrs參數提取

for a in alist:href = a.attrs['href']print(href)

使用BeautifulSoup爬取豆瓣Top250實例

網址:豆瓣電影 Top 250

導入庫,使用requests向網站發起請求,獲取頁面響應對象

.status_code狀態碼為200則請求成功,可以繼續下一步

import requests
from bs4 import BeautifulSoupurl = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0'
}# 發送GET請求
response = requests.get(url, headers=headers)
print(response.status_code)

打開瀏覽器開發者工具,找到User-Agent復制

這次實驗我們爬取電影名稱和短語,我們通過觀察知道每個電影的信息都包含在一個div中,這個div的class選擇器為"info",而我們需要爬取的數據在這個div里面。

import requests
from bs4 import BeautifulSoupurl = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0'
}# 發送GET請求
response = requests.get(url, headers=headers)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')divs = soup.find_all('div', class_='info')

獲取到每個電影外層的div元素后,再嵌套循環,將需要抓取的標簽使用.find()和.find_all()方法獲取到。

import requests
from bs4 import BeautifulSoupurl = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0'
}# 發送GET請求
response = requests.get(url, headers=headers)list = []if response.status_code == 200:# 解析html代碼soup = BeautifulSoup(response.text, 'html.parser')# 查找此頁面的所有div標簽,選擇器為'info'divs = soup.find_all('div', class_='info')# 遍歷獲取到的元素,獲取電影名稱和短語for div in divs:title = div.find_all('span')[0].textsen = div.find('span', class_='inq').textlist.append([title,sen])for l in list:print(l)

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

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

相關文章

【一刷《劍指Offer》】面試題 31:連續子數組的最大和

牛客對應題目鏈接&#xff1a;連續子數組最大和_牛客題霸_牛客網 (nowcoder.com) 力扣對應題目鏈接&#xff1a;53. 最大子數組和 - 力扣&#xff08;LeetCode&#xff09; 核心考點 &#xff1a;簡單動歸問題。 一、《劍指Offer》對應內容 二、分析題目 1、貪心 從前往后迭…

backbone主干網絡的選取

backbone_name 通常用于指定深度學習模型的主干網絡&#xff08;backbone network&#xff09;。主干網絡是指在整個模型中承擔主要特征提取任務的部分。不同的主干網絡有不同的架構和特征提取能力&#xff0c;適用于不同的任務和數據集。 針對戴著口罩和戴著3D眼睛提取人臉特征…

關于Posix標準接口和Nuttx操作系統

基本介紹 主要參考&#xff1a; Linux 系統中的 POSIX 接口詳細介紹_linux posix-CSDN博客 POSIX&#xff08;Portable Operating System Interface&#xff0c;可移植操作系統接口&#xff09;是由 IEEE&#xff08;Institute of Electrical and Electronics Engineers&#x…

大模型對齊方法筆記四:針對領域問答來進行知識對齊方法KnowPAT

KnowPAT KnowPAT(Knowledgeable Preference AlignmenT) 出自2023年11月的論文《Knowledgeable Preference Alignment for LLMs in Domain-specific Question Answering》&#xff0c;主要針對領域問答來進行知識對齊。 在領域問答有兩個挑戰&#xff1a;希望輸出滿足用戶的要…

Notepad++ 常用

File Edit search view Encoding Language Settings Tools Macro Run Plugins Window 文件 編輯 搜索 視圖 編碼 語言 設置 工具 宏 運行 插件 窗口 快捷方式 定位行 &#xff1a;CTRL g查找&#xff1a; CTRL F替換&am…

小白也能看得懂的基于HTML+CSS+JS實現的五子棋小游戲

五子棋是一種起源于中國的傳統棋類游戲&#xff0c;具有悠久的歷史。 基本規則 棋盤&#xff1a; 五子棋通常在一個 15x15 的棋盤上進行&#xff0c;但也可以在更大的棋盤上進行。棋盤上的每個交叉點稱為一個“點”。 棋子&#xff1a; 五子棋使用黑白兩色的棋子。兩名玩家分別…

【競技寶】歐冠:多特搶開局失敗,皇馬展示頂級防守反擊

本賽季歐冠決賽結束,皇馬在上半場被壓制的情況下,2比0擊敗多特蒙德奪得隊史第15座歐冠冠軍獎杯。比賽中多特蒙德已經展現出了不俗的狀態,可是面對老辣的皇馬他們還是敗下陣來,皇馬用頂級的防守反擊給多特上了一課。通過這場比賽,相信球迷們也清楚當今足壇硬實力不可或缺。 在許…

《Effective C++》《資源管理——14、在資源管理類中小心copying行為》

文章目錄 1、Terms14:Think carefully about copying behavior in resource-managing classes方法一&#xff1a;禁止復制方法二&#xff1a;對底層資源使出“引用計數法”方法三&#xff1a;復制底部資源方法四&#xff1a;轉移底部資源的擁有權 2、總結3、參考 1、Terms14:Th…

7-18 對象關系映射(orm_name)---PTA實驗C++

一、題目描述 一開始看到對象關系映射&#xff0c;其實我是拒絕的。這三個詞湊一塊&#xff0c;能是給C初學者的題嗎&#xff1f; 再仔細讀需求&#xff0c;才發現在課設項目已經用過這功能。Object Relational Mapping&#xff08;ORM&#xff09;就是面向對象&#xff08;O…

計算機基礎之:LSM樹

使用過hbase、cassandra之類nosql數據庫的小伙伴對LSM樹結構應該有所耳聞&#xff0c;那么這種數據結構有哪些優劣勢呢&#xff0c;本文做下簡單介紹。 LSM&#xff08;全稱&#xff1a;Log-Structured Merge Tree&#xff09;是一種廣泛應用于現代數據庫和存儲系統的數據結構…

《平淵》· 柒 —— 大道至簡?真傳一句話,假傳萬卷書!

《平淵》 柒 "真傳一句話, 假傳萬卷書" 對于 "大道至簡"&#xff0c;不少專家可能會說出一大堆亂七八糟的名詞, 比如這樣&#xff1a; 所謂 "大道" 即支撐天地運轉的 "系統自動力"&#xff0c;更具體地來說&#xff0c;即是天地人以…

快手游戲《無盡夢回》官宣開測:熱血動作肉鴿來襲

易采游戲網最新消息&#xff1a;5月30日11:00&#xff0c;快手自研的夢境主題動作冒險手游《無盡夢回》正式宣布開啟測試。此次測試名為“肉鴿進化實驗”&#xff0c;旨在測試多角色技能交會的玩法。游戲將開放32人同局競技&#xff0c;讓玩家在激烈的戰斗中角逐出唯一的勝利者…

HTML如何讓文字底部線條不緊貼在文字下面(既在內容下方又超出內容區域)

hello&#xff0c;大家好&#xff0c;星途星途今天給大家帶來的內容是如何讓文字底部線條不緊貼在文字下面。 話不多說&#xff0c;先上效果圖 簡單來說就是padding和margin的區別。 在網頁設計中&#xff0c;有時我們想要給某個元素添加一個裝飾性的線條&#xff0c;比如底部…

過濾器、監聽器、攔截器的區別

過濾器、監聽器、攔截器的區別 過濾器&#xff08;filter&#xff09;、監聽器&#xff08;Listener&#xff09;是JavaWeb的三大組件。而攔截器&#xff08;Interceptor&#xff09;是Spring框架中的。 我們主要是要分清除過濾器和攔截器的區別&#xff1a; 實現原理&#…

overleaf 寫參考文獻引用

目錄 1、 新建.bib 文件 2、導入引用 3、在文檔中引用參考文獻 4、生成參考文獻列表 1、 新建.bib 文件 在Overleaf項目中&#xff0c;你可以選擇導入現有的 .bib 文件或在項目中創建一個新的 .bib 文件來管理你的參考文獻。 導入.bib 文件&#xff1a; 在項目文件樹中點擊…

11. RBAC權限管理從零到一實現(二)

前端頁面已提交至git https://github.com/SJshenjian/cloud-web默認用戶名密碼admin 1

MySql 數據類型選擇與優化

選擇優化的數據類型 更小的通常更好 一般情況下盡量使用可以正確存儲數據的最小類型。更小的數據類型通常更快&#xff0c;因為它們占用更少的磁盤&#xff0c;內存和CPU緩存&#xff0c;并且處理時需要的CPU周期也更少。但也要確保沒有低估需要存儲值的范圍。 簡單就好 簡單的…

【自然語言處理】【Scaling Law】Observational Scaling Laws:跨不同模型構建Scaling Law

相關博客 【自然語言處理】【Scaling Law】Observational Scaling Laws&#xff1a;跨不同模型構建Scaling Law 【自然語言處理】【Scaling Law】語言模型物理學 第3.3部分&#xff1a;知識容量Scaling Laws 【自然語言處理】Transformer中的一種線性特征 【自然語言處理】【大…

jmeter性能優化之tomcat配置與基礎調優

一、 修改tomcat初始和最大堆內存 進入到/usr/local/tomcat7-8083/bin目錄下&#xff0c;編輯catalina.sh文件&#xff0c;&#xff0c;默認堆內存是600m&#xff0c;初始堆內存和最大堆內存保持一致&#xff0c; 可以更改到本機內存的70%&#xff0c;對于Linux系統&#xff0…

conda創建虛擬環境并激活

1 conda activate base 2 conda creat -n aaa python** 3 conda activate aaa 4 interpreter里面去選擇剛搞好的編譯器 ...../conda.exe