基于中国大学排名网站重构了,原视频中的代码需要部分修改,修改如下:
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:
# find函数找到包含自己第一个值的父类,并返回
# find_all函数找到包含自己全部的父类,并返回,可以使用for遍历
# 所有的大学的信息倍封装在标签<tbody>...</tbody>
if isinstance(tr,bs4.element.Tag):
# isinstance函数判断tr是否属于bs4库中tag类型
# 每个大学的信息被封装在标签<tr>...</tr>中
# 大学的名称被封装在标签<a>...</a>中
# 大学的其余信息被封装在标签<td>...</td>中
a = tr('a') #提取tr标签中a标签的信息,并且存为一个列表
tds = tr('td') #提取tr标签中td标签的信息,并且存为一个列表
ulist.append([tds[0].string.strip(),a[0].string.strip(),tds[4].string.strip()])
# tds[0]和tds[4]分别提取了大学的排名和得分信息
# tds[0].string表示在标签之间检索字符串
# .strip()函数表示移除字符串头尾指定的字符,这里是指的是空格
def printUnivList(ulist, num):
tplt = '{0:^10}\t{1:{3}^10}\t{2:^10}'
# \t代表4个空格,也就是一个Tab键
# {1:{3}^10}表示{}数据来源于format函数中第1个填充变量,^10,表示居中,10个字符。
# 上述{}中的{3}表示采用fomat函数中的第3个变量填充
print(tplt.format('排名','学校名称','总分',chr(12288)))
# 中西文混用的时候,采用chr(12288)进行中文字符的空格填充
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2],chr(12288)))
def main():
uinfo = []
url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo,10)
if __name__ == '__main__':
main()
运行结果如下:
排名 学校名称 总分
1 清华大学 852.5
2 北京大学 746.7
3 浙江大学 649.2
4 上海交通大学 625.9
5 南京大学 566.1
6 复旦大学 556.7
7 中国科学技术大学 526.4
8 华中科技大学 497.7
9 武汉大学 488
10 中山大学 457.2