文章目錄
一.基本介紹
目前流行使用的是beautifulSoup4(BeautifulSoup4簡稱bs4)開發bs4是一個HTML/XML的解析器,其主要功能是解析和提取HTML/XML數據。它不僅支持CSS選擇器,而且支持python標準庫中的HTML解析器,以及lxml的XML解析器
1.節點對象分類
bs4庫將複雜的HTML文檔轉換成樹結構(HTML DOM),這個結構中每個節點都是一個python對象,分類如下:
對象 | 說明 |
---|---|
bs4.element.Tag類 | 表示HTML中的標籤,是最基本的信息組織單元,它有兩個非常重要的屬性,分別是表示標籤名字的name屬性和表示標籤屬性的attrs屬性 |
bs4.element.NavigableString類 | 表示HTML中標籤的文本(非屬性字段) |
bs4.BeautifulSoup類 | 表示HTML DOM中的全部內容,支持遍歷文檔樹和搜索文檔樹的大部分方法 |
bs4.element.Comment類 | 表示標籤內字符串的註釋部分,是一種特殊的NavigableString對象 |
2.使用bs4的流程
(1)創建一個BeautifulSoup對象
(2)通過BeautifulSoup的操作方法進行解讀搜索
根據DOM樹進行各種節點的搜索,例如,find_all()方法可以搜索出所有滿足要求的節點
find方法只會搜索出第一個滿足要求的節點,只要獲得了一個節點,就可以訪問節點名稱,屬性和文本
(3)利用DOM樹結構標籤的特性,進行更爲詳細的節點信息提取
二.構建BeautifulSoup類
1.BeautifulSoup類構造方法解析
def __init__(
self,
markup="", 表示要解析的文檔字符串或文檔對象
features=None, 表示解析器的名稱
builder=None, 表示指定的解析器
parse_only=None,
from_encoding=None, 表示指定的編碼格式
exclude_encodings=None, 表示排除的編碼格式
**kwargs
)
2.創建BeautifulSoup對象
注意:如果沒有指定解析器,那麼BeautifulSoup對象會根據當前系統安裝的庫自動選擇解析器 解析器選擇順序爲:lxml html5lib python標準庫
from bs4 import BeautifulSoup
# str表示被解析HTML文檔的字符串,lxml表示使用lxml解析器
soup = BeautifulSoup(str,lxml)
3.prettify()方法
使用prettify()方法輸出剛創建的BeautifulSoup對象soup
print(soup.prettify())
4.常用的兩個方法
可以這些方法獲取文本和標籤屬性
(1)find() 用於查找符合條件的第一個標籤的節點
(2)find_all() 用於查找所有符合條件的標籤節點,並返回一個列表
5.find_all()方法解析
find_all()方法參數解析:
def find_all(self,
name=None, 查找所有名字爲name的標籤,但是字符串會被自動忽略
1.傳入字符串,BeautifulSoup對象會查找與字符串完全匹配的內容
2.傳入正則表達式,BeautifulSoup對象會通過re模塊match()進行匹配
3.傳入列表,BeautifulSoup對象會將與列表中任一元素匹配的內容返回
attrs={}, 如果某個指定名字的參數不是搜索方法中內置的參數名,那麼在進行搜索時,會把
該參數當作指定名稱的標籤中的屬性來搜索
1.soup.find_all(id="link") 會搜索每個標籤的id屬性
2.如果要搜索的標籤名稱爲class,由於class屬於python中的關鍵字,所有class後面要加一個下劃線
3.如果參數中包含特殊符號,可以將參數寫成字典類型 soup.find_all(attrs={"data-foo":"value"})
recursive=True, 在調用find_all()方法時,BeautifulSoup對象會檢索當前節點的所有子節點。這時,
如果只想搜索當前節點的直接子節點,就可以使用recursive = False
text=None, 傳入text參數,可以搜索文檔中的字符串內容。與name參數可選值一樣,text參數可以接受字符串
正則表達式,列表等
limit=None, 可以使用limit參數來限制返回結果的數量,其效果和SQL中的效果類似
**kwargs)
6.快速體驗BeautifulSoup小案例
案例說明:爬取古詩文大全7個頭標題和對應的href
知識點: 1.獲取標籤中的文本 。2.獲取標籤中的屬性
這些就是我們爬取的目標
import requests
from bs4 import BeautifulSoup
url = "https://so.gushiwen.org/shiwen/"
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
# 傳入標籤名和classs屬性,返回一個可遍歷集合
son1 = soup.find_all("div",class_="son1")
for item in son1:
# 查找每個item中a標籤
a = item.find_all('a')
for i in a: # 這裏 a 是一個結果集 可以遍歷
# print(type(i)) #<class 'bs4.element.Tag'>
# get_text() 方法可以獲取標籤內的所有文本內容
title = i.get_text()
# 獲取href屬性值,因爲 i 是一個bs4.element.Tag對象,前面已經介紹,所以可以直接獲取屬性
href = i['href']
# 打印輸出
print(title+" ==href==> "+href)
輸出結果
三.CSS選擇器
CSS(Cascading Style Sheets)層疊樣式表,是一種用來表現HTML或XML等文件樣式的計算機語言,它不僅可以靜態的修飾網頁,而且可以配合各種腳本語言動態地對網頁各元素進行格式化
1.通過標籤名查找
在編寫CSS時,標籤的名稱不用加任何修飾。調用select()方法時,可以傳入包含某個標籤的字符串 實例:
soup.select("title")
2.通過類名查找
在編寫CSS時,需要在類名的前面加上"." 例如查找類名sister的類名,即class=“sister”
soup.select(".sister")
3.通過ID名查找
在編寫CSS時,需要在id名稱前面加上 # 例如查找id名爲link1的標籤 即id=“link1”
soup.select("#link1")
4.通過組合的形式查找
組合查找與編寫class文件時,標籤名,類名,id名的組合原理一樣,二者之間需要用空格分開。例如:在標籤 p 中,查找id值等於link1的內容
soup.select("p #link1")
可以使用 > 將標籤與子標籤分隔,從而找到某個標籤下的直接子標籤
soup.select("head > title")
5.通過屬性進行查找
可以通過屬性元素進行查找,屬性需要用中括號括起來。但是屬性和標籤屬於同一節點,它們中間不能加空格,否則無法匹配到
soup.select("a[@href="/python/python-func-staticmethod.html"]")
6.CSS選擇器小案例
案例說明:爬取所有小標籤的標題和href
知識點: 1.使用CSS搜索指定標籤 。2.獲取標籤中的文本 。3.獲取標籤中的屬性
這是我們要爬取的內容
案例試驗
import requests
from bs4 import BeautifulSoup
url = "https://so.gushiwen.org/shiwen/"
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
# 使用css選擇器 a_list是list類型
# 搜索class="sright"的標籤的子標籤a
a_list = soup.select(".sright > a")
for a in a_list:
# 跟上面的小案例大同小異
title = a.get_text()
href = a['href']
print(title+" ==href==> "+href)
輸出結果
四.總結
1.從上面的案例可以看出,beautifulSoup4的API非常人性化,用起來非常簡單
2.beautifulSoup4是載入整個文檔,並轉換成整個樹結構。因此,beautifulSoup4需要花費更多的時間和內存,性能比較低。