python爬蟲(三):BeautifulSoup 【6. 例項】
爬取最好大學網的大學排名
需要掌握的其它知識:
(1)列表
list1=[1,2,3],list1.append([3,4])
(2)format用法
.format 比 % 更好用,按位置替換,詳細瞭解可以參考網址
https://blog.csdn.net/u014770372/article/details/76021988
(3)輸出的格式
print("{}\t{:^20}\t{}".format("排名","學校名稱","總分"))
\t:製表符
^:居中,預設是左對齊
20:寬度,預設是10
(4)find_all('td').string
find_all()方法因為找到了多個td,所以是個列表,不能直接.string,要這樣
soup.find_all('td')[0].string
soup.find_all('td')[1].string
輸出結果:
# requests庫連線網站取出資料,bs4庫html解析
import requests
from bs4 import BeautifulSoup
import bs4
# 獲取網頁內容
def getHTMLText(url):
try:
r = requests.get(url, timeout = 30)
# 判斷網頁狀態,200為正常
r.raise_for_status()
# 修改編碼,apparent_coding是基於文字內容分析出的格式
r.encoding = r.apparent_encoding
return r.text
except:
# 異常則返回一個空字串
return ""
# 提取網頁內容(r.text)到合適的資料結構(列表)
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, 'html.parser')
# 觀察發現大學資訊都在標籤tbody-tr-td中,遍歷子節點的標籤,找出td
for i in soup.find('tbody').children:
# isinstance是python判斷變數型別的函式,bs4.element.Tag是標籤,如soup.a
# Tag的常用操作有.name .attrs .string
if isinstance(i, bs4.element.Tag):
# 可簡寫為tds = i('td')
tds = i('td')
# 取出大學排名、名稱、評分,加到ulist列表中
ulist.append([tds[0].string, tds[1].string, tds[2].string])
# 輸出資訊,num是輸出資訊的條數
def printUnivList(ulist, num):
# 格式化輸出
# 表頭
print("{:^10}\t{:^6}\t{:^10}".format("排名", "學校名稱", "總分"))
# 表內容
for i in range(num):
u = ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1],u[2]))
# 主函式
def main():
# 大學資訊放到列表unifo中
uinfo = []
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20)
main()