項(xiàng)目基本信息
目標(biāo)網(wǎng)站:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html
輸入:大學(xué)排名URL鏈接
輸出:大學(xué)排名信息的屏幕輸出(排名,大學(xué)名稱(chēng),總分)
技術(shù)路線:requests-bs4
定向爬蟲(chóng):僅對(duì)輸入 URL 進(jìn)行爬取,不擴(kuò)展爬取
程序的結(jié)構(gòu)設(shè)計(jì):
步驟1:從網(wǎng)絡(luò)上獲取大學(xué)排名網(wǎng)頁(yè)內(nèi)容??getHTMLText()
步驟2:提取網(wǎng)頁(yè)內(nèi)容中信息到合適的數(shù)據(jù)結(jié)構(gòu)??fillUnivList()
步驟3:利用數(shù)據(jù)結(jié)構(gòu)展示并輸出結(jié)果??printUnivList()
目標(biāo)網(wǎng)頁(yè)樣式:

相關(guān)知識(shí)
格式化字符串的函數(shù): str.format()
基本語(yǔ)法是通過(guò) {} 和 : 來(lái)代替以前的 % 。format 函數(shù)可以接受不限個(gè)參數(shù),位置可以不按順序。
一般用法:
"{} {}".format("hello", "world")
"{0} {1}".format("hello", "world")
"{1} {0} {1}".format("hello", "world")
"網(wǎng)站名:{name},地址:{url}".format(name="百度", url="www.baidu.com")
格式化輸出:
^, <, > 分別是居中、左對(duì)齊、右對(duì)齊,后面帶寬度,: 號(hào)后面帶填充的字符,只能是一個(gè)字符,不指定則默認(rèn)是用空格填充。+ 表示在正數(shù)前顯示 +,負(fù)數(shù)前顯示 -;(空格)表示在正數(shù)前加空格。
b、d、o、x 分別是二進(jìn)制、十進(jìn)制、八進(jìn)制、十六進(jìn)制。

| 數(shù)據(jù) | 格式 | 輸出 | 描述 |
|---|---|---|---|
| 2.718 | {:.0f} | 3 | 不帶小數(shù) |
| 5 | {:0>2d} | 05 | 數(shù)字補(bǔ)零 (填充左邊, 寬度為2) 十進(jìn)制 |
| 1000000 | {:,} | 1,000,000 | 以逗號(hào)分隔的數(shù)字格式 |
| 0.25 | {:.2%} | 25.00% | 百分比格式 |
實(shí)例編寫(xiě)
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])
def printUnivList(ulist, num):
print("{:^10}\t{:^6}\t{:^10}".format("排名","學(xué)校名稱(chēng)","總分"))
for i in range(num):
u=ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
def main():
uinfo = []
url = 'https://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20 univs
main()
輸出結(jié)果:

實(shí)例優(yōu)化
當(dāng)中文字符寬度不夠時(shí),采用西文字符填充;中西文字符占用寬度不同。采用中文字符的空格填充 char(12288)。
代碼修改:
def printUnivList(ulist, num):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","學(xué)校名稱(chēng)","總分",char(12288)))
for i in range(num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],char(12288)))
: 前的索引對(duì)應(yīng)后面的內(nèi)容,: 后面為輸出的格式,:{3}^10 表示以空格填充,寬度為 10 ,居中對(duì)齊,其中 3 即為空格的索引。
輸出結(jié)果:
