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