請你先點擊這個連結 : https://www.pythonscraping.com/pages/page3.html
針對這個網站,我們在意的資料大概有四項,包括 :
商品標題、商品描述、商品價格、商品圖片 (圖片連結)
我們的目的就是要爬取這些資訊
由於這個 HTML 結構又更複雜了,很難直接用肉眼去觀察原始碼
這時候我們需要一些工具幫助我們快速找到我們要的資料
import requests from bs4 import BeautifulSoup
response = requests.get('http://pythonscraping.com/pages/page3.html')
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify())
|
取得 HTML 內容以後,可以使用 prettify() 這個函式,它會去幫你做基本的排版
執行結果
結果算是有些差強人意,沒有變得比較好看
畢竟因為礙於終端機的顯示大小,加上沒有語法高亮,還是難以閱讀
這個功能知道一下就好,還是可以看場合使用
你也可以在瀏覽器頁面,直接對著文字按下右鍵 -> 檢查
這個功能和 prettify() 一模一樣,可讀性更高
經過一番分析,我們可以得到以下程式碼 :
import requests from bs4 import BeautifulSoup
# Get HTML and parse it response = requests.get('http://pythonscraping.com/pages/page3.html')
soup = BeautifulSoup(response.text, 'html.parser')
# Print the gifts tr_list = soup.find_all('tr', class_ = 'gift')
for tr in tr_list: print(tr.find('img').get('src').strip().replace('..', 'https://www.pythonscraping.com') + '\n')
td_list = tr.find_all('td')
for td in td_list: print(td.text.strip() + '\n')
|
執行結果
因為終端機大小的關係,沒辦法用成像表格那樣顯示,或者說 Description 太長了
所以就以 Image , Item Title , Description , Cost 這樣去顯示,程式比較好撰寫
那就從 Print the gifts 那行註解開始解說起
整個 HTML 總共有 6 個 <tr> 節點,不過我們只需要後面 5 個
因為第一個是大標題系列,我們不想要這些資料
tr_list = soup.find_all('tr', class_ = 'gift')
這行程式碼,剛好會回傳後面 5 個 <tr> 的,故稱作 tr_list
這裡有幾個重點
首先,我們要找到「全部」的 <tr> 節點,所以我們使用 find_all()
但是我們又不想爬取第 1 個 <tr>,只想要後面 5 個
我們就可以利用節點的 class 屬性過濾掉
因為第 1 個節點沒有 gift 屬性,後面 5 個都有
注意 ! class 是 Python 的保留字,Beautiful Soup 這邊定義它是 class_ !
接下來就可以用 for 去疊代每一個節點了
首先我們 print 出它的網址,這裡有點複雜
我們先找到 img 這個節點,然後用 get() 取出其中的 src 屬性
接著用 strip() 去除頭尾的空白 (沒使用的話會被換行)
由於取出來的字串會是 ../img/gifts/img1.jpg,所以我們再把 .. 換成網站的 Domain 就完成了
來做個 URL 解析好了
以 https://www.pythonscraping.com/img/gifts/img1.jpg 來說
https 是傳輸協定,www.pythonscraping.com 是網域,img/gifts/img1.jpg 是檔案
也就是說,用 https 傳輸協定到 www.pythonscraping.com 這個網域的 img/gifts/ 這個資料夾取得 img1.jpg 這個檔案
接著看到 td_list = tr.find_all('td') 這行
因為每個 <tr> 底下又包著許多 <td>,其實就是一些商品資訊
一樣用 find_all() 找出來,再去疊代 print 出來
Beautiful Soup 的用法實在太多太多了,希望大家可以不看原始碼,自己爬取一遍
可以不用每個用法都記沒關係,但是要用的時候可以多多翻閱官方文件,我自己也是要用才查詢
下一章節我會幫大家做個總結