按照北京理工嵩天老師課程代碼,一步步實(shí)現(xiàn)。
首先查看最好大學(xué)網(wǎng)是否存在robots:
在瀏覽器中修改網(wǎng)址為以下:
http://www.zuihaodaxue.com/robots.txt
查看結(jié)果:

404.png
可知不存在robots.txt文檔
從最好大學(xué)網(wǎng)獲取大學(xué)排名信息并存儲(chǔ)

最好大學(xué)網(wǎng)排名.png
查看目標(biāo)網(wǎng)頁(yè)源代碼,確認(rèn)待存儲(chǔ)項(xiàng)在網(wǎng)頁(yè)代碼中的結(jié)構(gòu):

網(wǎng)頁(yè)源代碼.png
一個(gè)學(xué)校信息是由一個(gè)<tr></tr>標(biāo)簽內(nèi)存儲(chǔ)的多個(gè)<td></td>標(biāo)簽信息。
代碼如下:
import requests
from bs4 import BeautifulSoup
import bs4
# 從網(wǎng)絡(luò)中獲取大學(xué)排名網(wǎng)頁(yè)內(nèi)容
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.status_code
return r.text
except:
return ''
# 提取網(wǎng)頁(yè)內(nèi)容中信息到合適的數(shù)據(jù)結(jié)構(gòu)
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, 'html.parser')
# 解析html代碼中tbody所在的位置
for tr in soup.find('tbody').children:
# 找到每所大學(xué)所在的tr標(biāo)簽
if isinstance(tr, bs4.element.Tag):
# 存儲(chǔ)所有的td標(biāo)簽
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])
# 利用數(shù)據(jù)結(jié)構(gòu)展示并輸出結(jié)果
def printUnivList(ulist, num):
print("{:^10}\t{:^6}\t{:^10}\t".format("排名", "學(xué)校名稱", "總分"))
for i in range (num):
u = ulist[I]
print("{:^10}\t{:^6}\t{:^10}\t".format(u[0],u[1],u[2]))
def main():
uinfo = []
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20)
main()
運(yùn)行結(jié)果如下:

運(yùn)行結(jié)果.png
輸出結(jié)果對(duì)齊問題
format函數(shù)中英文長(zhǎng)度不同導(dǎo)致中文對(duì)齊問題
(字符寬度不夠選擇英文字符來填充)
原代碼:
print("{:^10}\t{:^6}\t{:^10}\t".format("排名", "學(xué)校名稱", "總分"))
解決方法:
字符寬度不夠選擇參數(shù)中第四個(gè)參數(shù)(中文字符)來填充,
修改代碼:
def printUnivList(ulist, num):
tplt = "{0:^10}\t{1:{3}^6}\t{2:^10}\t"
print(tplt.format("排名", "學(xué)校名稱", "總分", chr(12288)))
for i in range (num):
u = ulist[i]
print(tplt.format(u[0],u[1],u[2], chr(12288)))
修改后的結(jié)果:

修改結(jié)果.png