BeautifulSoup是一個非常流行的Python庫,廣泛應用于網絡爬蟲開發中,用于解析HTML和XML文檔,以便于從中提取所需數據。它是進行網頁內容抓取和數據挖掘的強大工具。
功能特性
- 易于使用: 提供簡潔的API,使得即使是對網頁結構不熟悉的開發者也能快速上手。
- 文檔解析: 支持多種解析器,包括Python標準庫中的HTML解析器以及第三方的lxml解析器,后者速度更快且功能更強大。
- 自動編碼識別: 自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為UTF-8編碼,簡化了編碼處理的復雜性。
- 導航與搜索: 提供了豐富的選擇器和方法,如 .find(), .find_all(), .select() 等,便于按標簽名、屬性、類名等查找元素。
- 數據提取: 可以輕松地提取和修改HTML或XML文檔中的數據,支持遍歷和搜索DOM樹,提取文本、屬性等信息。
- 靈活的輸出格式: 可以將解析后的數據輸出為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)