做獨(dú)立網(wǎng)站的好處網(wǎng)絡(luò)推廣最好的網(wǎng)站有哪些
BeautifulSoup是一個(gè)非常流行的Python庫,廣泛應(yīng)用于網(wǎng)絡(luò)爬蟲開發(fā)中,用于解析HTML和XML文檔,以便于從中提取所需數(shù)據(jù)。它是進(jìn)行網(wǎng)頁內(nèi)容抓取和數(shù)據(jù)挖掘的強(qiáng)大工具。
功能特性
- 易于使用: 提供簡潔的API,使得即使是對網(wǎng)頁結(jié)構(gòu)不熟悉的開發(fā)者也能快速上手。
- 文檔解析: 支持多種解析器,包括Python標(biāo)準(zhǔn)庫中的HTML解析器以及第三方的lxml解析器,后者速度更快且功能更強(qiáng)大。
- 自動(dòng)編碼識別: 自動(dòng)將輸入文檔轉(zhuǎn)換為Unicode編碼,輸出文檔轉(zhuǎn)換為UTF-8編碼,簡化了編碼處理的復(fù)雜性。
- 導(dǎo)航與搜索: 提供了豐富的選擇器和方法,如 .find(), .find_all(), .select() 等,便于按標(biāo)簽名、屬性、類名等查找元素。
- 數(shù)據(jù)提取: 可以輕松地提取和修改HTML或XML文檔中的數(shù)據(jù),支持遍歷和搜索DOM樹,提取文本、屬性等信息。
- 靈活的輸出格式: 可以將解析后的數(shù)據(jù)輸出為Python對象、字符串或者保存為文件。
目錄
安裝BeautifulSoup
基本使用
BeautifulSoup獲取對象
選擇器
1、CSS選擇器(select()方法):
2、Tag名:
3、屬性選擇:
方法
.find_all()
.find()
示例
使用BeautifulSoup爬取豆瓣Top250實(shí)例
安裝BeautifulSoup
在命令窗口安裝
pip install
基本使用
我們使用requests庫發(fā)送請求獲取html,獲得的是html字符串,在爬蟲中,只有正則表達(dá)式(re)才可以直接對html字符串進(jìn)行解析,而對于html字符串我們無法使用xpath語法和bs4語法進(jìn)行直接提取,需要通過lxml或者bs4對html字符串進(jìn)行解析,解析為html頁面才能進(jìn)行數(shù)據(jù)提取。
在xpath中我們使用lxml進(jìn)行解析,但是在bs4中,我們有很多的解析器對網(wǎng)頁進(jìn)行解析。
這里我們只說一種最常用最簡單的解析器"html.parser"
簡單來說BeautifulSoup是一個(gè)從html字符串提取數(shù)據(jù)的工具,使用BeautifulSoup分為三步:
第一步 導(dǎo)入BeautifulSoup類,抓取網(wǎng)頁同時(shí)也導(dǎo)入requests庫
from bs4 import BeautifulSoup
import requests
第二步 傳遞初始化參數(shù)(HTML代碼,HTML解析器),并初始化
這里解析器使用'html.parser',這是python自帶的解析器,更方便使用
# html_code:html代碼 html.parser:解析器,python自帶的解析器
soup = BeautifulSoup(html_code, 'html.parser')
第三步 獲取實(shí)例對象,操作對象獲取數(shù)據(jù)
BeautifulSoup獲取對象可以使用選擇器和方法。
BeautifulSoup獲取對象
選擇器
1、CSS選擇器(select()方法):
支持ID選擇器、類選擇器、屬性選擇器、偽類等
復(fù)雜選擇
- 組合選擇器:可以使用逗號 , 分隔多個(gè)選擇器來選擇多個(gè)不同類型的元素。
- 后代選擇器:使用空格表示,如 .story a 選取所有.story類內(nèi)的<a>標(biāo)簽。
- 子選擇器:使用 > 表示直接子元素,如 body > p 選取<body>直接下的所有段落。
- 屬性選擇器:如 [href*=example] 選取所有href屬性包含"example"的元素。
- 偽類選擇器:如 a:hover、:first-child 等,雖然不是所有CSS偽類在BeautifulSoup中都可用,但一些基本的如:first-child, :last-child等有時(shí)也能派上用場。
2、Tag名:
- 直接使用tag名作為屬性,如 soup.div 返回第一個(gè)<div>標(biāo)簽。
- 支持通過列表索引來定位特定的標(biāo)簽,如 soup.divs[0]。
3、屬性選擇:
使用[attribute=value]語法,例如 soup.find_all(attrs={'class': 'active'}) 查找所有class為"active"的元素。
方法
.find_all()
查找文檔中所有匹配指定條件的tag,返回一個(gè)列表。
參數(shù)可以精確指定tag名字、屬性、文本內(nèi)容等。
.find()
類似于.find_all(),但只返回第一個(gè)匹配的元素。
示例
1、獲取所有div標(biāo)簽
soup.find_all('div')
2、獲取擁有指定屬性的標(biāo)簽(id='even'的div標(biāo)簽)
soup.find_all('div', id='even')
如果有多個(gè)屬性的標(biāo)簽,可以使用字典模式
soup.find_all('div', attrs={"id":"even", "class":"cc"})
soup.find_all('div', id='even',class_='c')
使用字典形式,還可以添加樣式屬性,更加靈活
3、獲取標(biāo)簽的屬性值
方法1:通過下標(biāo)方式提取
alist = soup.find_all('a')
# 我想獲取a標(biāo)簽的href值
for a in alist:href = a['href']print(href)
方法2:利用attrs參數(shù)提取
for a in alist:href = a.attrs['href']print(href)
使用BeautifulSoup爬取豆瓣Top250實(shí)例
網(wǎng)址:豆瓣電影 Top 250
導(dǎo)入庫,使用requests向網(wǎng)站發(fā)起請求,獲取頁面響應(yīng)對象
.status_code狀態(tài)碼為200則請求成功,可以繼續(xù)下一步
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'
}# 發(fā)送GET請求
response = requests.get(url, headers=headers)
print(response.status_code)
打開瀏覽器開發(fā)者工具,找到User-Agent復(fù)制
這次實(shí)驗(yàn)我們爬取電影名稱和短語,我們通過觀察知道每個(gè)電影的信息都包含在一個(gè)div中,這個(gè)div的class選擇器為"info",而我們需要爬取的數(shù)據(jù)在這個(gè)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'
}# 發(fā)送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')
獲取到每個(gè)電影外層的div元素后,再嵌套循環(huán),將需要抓取的標(biāo)簽使用.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'
}# 發(fā)送GET請求
response = requests.get(url, headers=headers)list = []if response.status_code == 200:# 解析html代碼soup = BeautifulSoup(response.text, 'html.parser')# 查找此頁面的所有div標(biāo)簽,選擇器為'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)