網站首頁 編程語言 正文
1.Beautiful Soup庫簡介
Beautiful Soup 簡稱 BS4(其中 4 表示版本號)是一個 Python 中常用的頁面解析庫,它可以從 HTML 或 XML 文檔中快速地提取指定的數據。
相比于之前講過的
lxml
庫,Beautiful Soup 更加簡單易用,不像正則和 XPath 需要刻意去記住很多特定語法,盡管那樣會效率更高更直接。
對大多數 Python 使用者來說,好用會比高效更重要。
Beautiful Soup庫為第三方庫,需要我們通過
pip
命令安裝:
pip install bs4
BS4 解析頁面時需要依賴文檔解析器,所以還需要一個文檔解析器。
Python 自帶了一個文檔解析庫html.parser
, 但是其解析速度稍慢,所以我們結合上篇內容(Python 文檔解析:lxml庫的使用),安裝lxml
作為文檔解析庫:
pip install lxml
2.Beautiful Soup庫方法介紹
使用 bs4 的初始化操作,是用文本創建一個
BeautifulSoup
對象,并指定文檔解析器:
from bs4 import BeautifulSoup html_str = ''' <div> <ul> <li class="web" id="0"><a href="www.python.org" >Python</a></li> <li class="web" id="1"><a href="www.java.com" >Java</a></li> <li class="web" id="2"><a href="www.csdn.net" >CSDN</a></li> </ul> </div> ''' soup = BeautifulSoup(html_str, 'lxml') # prettify()用于格式化輸出HTML/XML文檔 print(soup.prettify())
bs4 提供了
find_all()
與find()
兩個常用的查找方法它們的用法如下:
2.1 find_all()
find_all()
方法用來搜索當前tag
的所有子節點,并判斷這些節點是否符合過濾條件,最后以列表形式將符合條件的內容返回,語法格式如下:
find_all(name, attrs, recursive, text, limit)
參數說明:
name:查找所有名字為 name 的 tag 標簽,字符串對象會被自動忽略。attrs:按照屬性名和屬性值搜索 tag 標簽,注意由于 class 是 Python 的關鍵字,所以要使用 “class_”。recursive:find_all() 會搜索 tag 的所有子孫節點,設置 recursive=False 可以只搜索 tag 的直接子節點。text:用來搜文檔中的字符串內容,該參數可以接受字符串 、正則表達式 、列表、True。limit:由于 find_all() 會返回所有的搜索結果,這樣會影響執行效率,通過 limit 參數可以限制返回結果的數量。
from bs4 import BeautifulSoup html_str = ''' <div> <ul> <li class="web" id="0"><a href="www.python.org" >Python</a></li> <li class="web" id="1"><a href="www.java.com" >Java</a></li> <li class="web" id="2"><a href="www.csdn.net" >CSDN</a></li> </ul> </div> ''' soup = BeautifulSoup(html_str, 'lxml') print(soup.find_all("li")) print(soup.find_all("a")) print(soup.find_all(text="Python"))
上面程序使用
find_all()
方法,來查找頁面中所有的<li></li>
標簽、<a></a>
標簽和"Python"
字符串內容。
2.2 find()
find()
方法與find_all()
方法極其相似,不同之處在于find()
僅返回第一個符合條件的結果,因此find()
方法也沒有limit
參數,語法格式如下:
find(name, attrs, recursive, text)
除了和
find_all()
相同的使用方式以外,bs4 為find()
方法提供了一種簡寫方式:
soup.find("li") soup.li
這兩行代碼的功能相同,都是返回第一個
<li></li>
標簽,完整程序:
from bs4 import BeautifulSoup html_str = ''' <div> <ul> <li class="web" id="0"><a href="www.python.org" >Python</a></li> <li class="web" id="1"><a href="www.java.com" >Java</a></li> <li class="web" id="2"><a href="www.csdn.net" >CSDN</a></li> </ul> </div> ''' soup = BeautifulSoup(html_str, 'lxml') print(soup.li) print(soup.a)
上面的程序會打印出第一個
<li></li>
標簽和第一個<a></a>
標簽。
2.3 select()
bs4 支持大部分的 CSS 選擇器,比如常見的標簽選擇器、類選擇器、id 選擇器,以及層級選擇器。Beautiful Soup 提供了一個
select()
方法,通過向該方法中添加選擇器,就可以在 HTML 文檔中搜索到與之對應的內容。
應用如下:
from bs4 import BeautifulSoup html_str = ''' <div> <ul> <li class="web" id="web0"><a href="www.python.org" >Python</a></li> <li class="web" id="web1"><a href="www.java.com" >Java</a></li> <li class="web" id="web2"><a href="www.csdn.net" >CSDN</a></li> </ul> </div> ''' soup = BeautifulSoup(html_str, 'lxml') #根據元素標簽查找 print(soup.select('body')) #根據屬性選擇器查找 print(soup.select('a[href]')) #根據類查找 print(soup.select('.web')) #后代節點查找 print(soup.select('div ul')) #根據id查找 print(soup.select('#web1'))
更多方法及其詳細使用說明,請參見官方文檔:
https://beautiful-soup-4.readthedocs.io/en/latest/
3.代碼實例
學會了 Beautiful Soup ,讓我們試著改寫一下上次的爬蟲代碼吧:
import os import sys import requests from bs4 import BeautifulSoup x = requests.get('https://www.csdn.net/') soup = BeautifulSoup(x.text, 'lxml') img_list = soup.select('img[src]') # 創建img文件夾 os.chdir(os.path.dirname(sys.argv[0])) if not os.path.exists('img'): os.mkdir('img') print('創建文件夾成功') else: print('文件夾已存在') # 下載圖片 for i in range(len(img_list)): item = img_list[i]['src'] img = requests.get(item).content if item.endswith('jpg'): with open(f'./img/{i}.jpg', 'wb') as f: f.write(img) elif item.endswith('jpeg'): with open(f'./img/{i}.jpeg', 'wb') as f: f.write(img) elif item.endswith('png'): with open(f'./img/{i}.png', 'wb') as f: f.write(img) else: print(f'第{i + 1}張圖片格式不正確') continue print(f'第{i + 1}張圖片下載成功')
這就是本文的全部內容了,快去動手試試吧!
原文鏈接:https://blog.csdn.net/qq_63585949/article/details/126762330
相關推薦
- 2022-12-23 Sql?Server?壓縮數據庫日志文件的方法_MsSql
- 2022-09-16 C語言庫函數getchar()新見解_C 語言
- 2023-06-03 Django使用jinja2模板的實現_python
- 2023-10-16 textarea文本編輯器改變字體顏色
- 2023-04-29 Python如何實用File文件的實現_python
- 2022-05-11 如果解決tomcat端口號被占用
- 2022-08-21 深入了解C語言中常見的文件操作方法_C 語言
- 2022-04-16 python代碼有一行標黃問題的解決方案_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支