BeatifulSoup 的使用
還記得之前我們在第一個爬蟲案例中使用過的 BeatifulSoup 嗎?這節(jié)課我們就來正式學習一下 BeatifulSoup 這個頁面提取工具,通過本節(jié)課的學習你會熟悉使用 BeatifulSoup 提取常見的網(wǎng)頁元素。
- BeatifulSoup 的基本概念
- BeatifuSoup 的解析器
- BeatifulSoup 的搜索篩選
1. BeatifulSoup 簡介
使用 Requests 獲取到頁面源碼后,我們需要一種工具來幫助我們結構化這些數(shù)據(jù),從而方便我們檢索需要的某個或者某些數(shù)據(jù)內容。BeautifulSoup 庫就是這樣一種工具,可以很方便我們對數(shù)據(jù)進行解析和數(shù)據(jù)的提取。
BeautifulSoup 的名字來源于大家耳熟能詳?shù)囊徊客鈬锩娴男≌f,這部小說的名字叫做《愛麗絲夢游仙境》。從名字就可以看出,發(fā)明這個庫的作者的目的是為了讓使用這個庫的人,心情舒暢,使用起來很方便舒適,接口簡單人性化。
2. 安裝 BeautifulSoup
因為 BeautifulSoup 并不是 Python 內置的庫,我們需要額外安裝它。我們現(xiàn)在普遍使用的版本是 BeautifulSoup4, 簡稱作 bs4。
使用 pip 來安裝 BeautifulSoup 很簡單,打開 CMD 窗口運行下面這條命令:
pip install beautifulsoup4
安裝成功后,如圖所示:
2. BeatifuSoup 解析器
解析器是一種幫我們結構化網(wǎng)頁內容的工具,通過解析器,我們可以得到結構化的數(shù)據(jù),而不是單純的字符,方便我們解析和查找數(shù)據(jù)。
BeautifulSoup 的解析器有 html.parse,html5lib,lxml 等。BeautifulSoup 本身支持的標準庫是 html.parse,html5lib。但是,lxml 的性能非常棒,以及擁有良好的容錯能力,現(xiàn)在被廣泛的使用。
解析器對比:
-
html.parse 是 Python 標準庫的解析器,這個解析器執(zhí)行速度不是太快,但是文檔容錯能力比較好。
-
html.5lib 同樣是內置的解析器,它是通過瀏覽器的方式解析數(shù)據(jù),可以生成良好的 HTML5 格式的文檔,但是速度比較慢。
-
lxml 是第三方解析器,需要額外安裝。這個解析器執(zhí)行速度快,并且是唯一支持 XML 的解析器。在這里我們也會選用 lxml 來進行講解。
安裝 lxml 和安裝 BeautifulSoup 類似,同樣只需一行命令就好:
pip install lxml
安裝成功后,如下所示:
3. BeautifulSoup 的四類對象
BeautifulSoup 將 HTML 轉換成樹形結構,每個節(jié)點都是 Python 對象,所有對象可以歸納為 4 種:
- Tag;
- NavigableString;
- BeautifulSoup;
- Comment。
下面我們一一來看下這四類對象:
- Tag(標簽) ,指的就是 HTML 里面的標簽,比如我們常見的 title,head 等標簽。
<title></title>
- NavigableString (可遍歷的字符串):在獲取標簽之后,我們需要取標簽里內容文字,我們使用 string 屬性來獲取。string 屬性就是輸出標簽里內容,它的類型就是 fNavigableString。
比如,我們可以通過 string 屬性,獲取 “慕課網(wǎng)” 字符串。
<title>慕課網(wǎng)</title>
-
BeautifulSoup (文檔對象):表示一個文檔的全部內容,也就是整個文檔,是一種廣義的 Tag 對象。
-
Comment (評論):注釋對象,這個是 NavigableString 的特殊類型,也就是文本里面的注釋內容。
指的是獲取 HTML 的注釋內容,如下所示:
<!-- 慕課網(wǎng) -->
4. BeautifulSoup 搜索文檔樹
下面我們就來具體使用一下 BeautifulSoup 這個解析工具,我們首先模仿 HTML 頁面結構創(chuàng)建一個字符串:
<html>
<head>
<title>hello world</title>
</head>
<body>
<div>
<p class="p-one a-item" id="aaa">python introduction</p>
<p class="p-one">Basic Python Class</p>
</div>
<p class="p-two a-item" id="bbb"><b>Java introduction</b></p>
<p class="p-two"><b>Basic Java Class</b></p>
</body>
</html>
4.1 字符串
from bs4 import BeautifulSoup
soup = BeautifulSoup (open("bs4.html"), features="lxml")
soup.find_all('p')
4.2 正則表達式
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup (open("bs4.html"), features="lxml")
for tag in soup.find_all(re.compile("b")):
print(tag.name)
4.3 列表
from bs4 import BeautifulSoup
soup = BeautifulSoup (open("bs4.html"), features="lxml")
soup.find_all(["a", "b"])
4.4 搜索屬性
from bs4 import BeautifulSoup
soup = BeautifulSoup (open("bs4.html"), features="lxml")
soup.find_all("p", id="aaa")
4.5 搜索字符串內容
from bs4 import BeautifulSoup
soup = BeautifulSoup (open("bs4.html"), features="lxml")
soup.find_all(string="Java")
4.6 搜索 CSS
from bs4 import BeautifulSoup
soup = BeautifulSoup (open("bs4.html"), features="lxml")
soup.find_all(["a", "b"])
5. 小結
工作中,我們一般經(jīng)常的使用的方法就是 find_all 方法。但是,除了上述我們講的 find_all 方法之外,BeautifulSoup 還有其他一些以 find 開頭的方法,由于不是經(jīng)常使用,這里就簡單的列舉一下,如果同學們感興趣的話可以自己深入了解下。
方法名稱 | 作用 |
---|---|
find_all() | 搜索當前節(jié)點的所有子節(jié)點和孫子節(jié)點,并直接返回所有結果。 |
find_parents/find_parent | 搜索當前節(jié)點的父親節(jié)點 |
find_next_siblings/find_next_sibling | 搜索所有的后續(xù)的兄弟節(jié)點 |
find_previous_siblings/find_previous_sibling | 搜有當前的兄弟節(jié)點 |
find_all_next()/find_next | 對當前節(jié)點的后續(xù)標簽和字符串進行循環(huán)迭代 |
find_all_previous/find_previous | 對當前節(jié)點的前面標簽和字符串進行循環(huán)迭代 |