今天練習的是抓取NBA 新聞標題與網頁連結。
在網頁下方有新聞標題。
將滑鼠移到新聞標題,按下右鍵,再按下檢查
在網頁內容中可以看到這個網頁的 HTML 標籤與內容。
仔細觀察一下網頁內容和原始碼的標籤(tag)的對應關係,它們似乎是 以 <dt> </dt> 標籤(tag)作為網頁文字內容。這裡有10個<dt> </dt> 標籤
而網頁標題的數量也剛好有10個
程式寫作與驗證
1. 先利用 requests 裡的 get() 讀取 網頁位址
resp = requests.get(url)
取得 BeautifulSoup 物件
sp=BeautifulSoup(resp.text, 'lxml')
先抓取 id="news_list_body"
結果正常,抓到標籤與內容文字
再看一下HTML 標籤內容:先遇到 <dl>,接下來才是<td>。下一組的指令是先抓<dl>
out=sp.find(id="news_list_body").find("dl")
結果也正確:
下一步才是抓取 <dt> </dt> 標籤
out=sp.find(id="news_list_body").find("dl").find_all("dt")
結果也正確:
接下來就是抓取每一筆<dt> </dt> 標籤的內容
想要抓取 新聞裡的子連結(sub-link),應該這樣寫:
sublink=dt.find("a").get("href")
但看一下這些內容只有相對路徑的網址。如果我們由網際網路去連,可能連不上。
所以這個網址應該要加上原來的網站網址:https://nba.udn.com/nba/news
抓取標題
headtext=dt.find("h3").text
利用串列(list)來存放資料
<dt> </dt> 標籤 有很多項目,我們可以用 for 迴路來讀取每一筆資料。
首先,在 for 迴路以外先建立一個 nba_news串列(list)
nba_news=[]
加入陣列用 append() 函數
nba_news.append([headtext, reallink])
為了儲存檔案,可以用 Pandas DataFrame
DataFrame(nba_news,columns=['標題','網址']).to_csv('nba_news.csv',encoding='utf-8-sig',index=0)
留言列表