先贴代码
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('tbody')函数,搜索name=‘tbody’的标签,只返回一个结果,即tbody标签(Tag类型的对象)
#....children得到tbody的所有子标签的迭代类型
if isinstance(tr,bs4.element.Tag):#如果子标签的类型不是Tag类型,就去掉
a = tr('a')#以列表类型返回所有的‘a’标签
tds = tr('td')#以列表类型返回所有的‘td’标签,其中第一个td标签包含排名信息,第五个td标签包含分数信息
ulist.append([tds[0].string.strip(), a[0].string.strip(), tds[4].string.strip()])
#td标签的string属性里存有所需信息,strip()函数跳过字符串里的空格
def printUnivList(ulist1,num):#num表示要将列表中的多少个学校信息打印出来
tplt = "{0:^10}\t{1:{3}^12}\t{2:^10}"
# 0、1、2作用为“排名","学校名称","总分"三个字符串分别放在第0,1,2位,'^'表示字符串位置居中
#{3}表示若宽度不够,使用format的3号位置处的chr(12288)(中文空格)进行填充,避免分数对不齐的情况发生
print(tplt.format("排名","学校名称","总分",chr(12288)))
for i in range(num):
u = ulist1[i]
print(tplt.format(u[0], u[1], u[2],chr(12288)))
def main():
uinfo = [] #将大学信息放到列表中
url = "https://www.shanghairanking.cn/rankings/bcur/2020"
html = getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,30)#因为只读取了第一页的url链接,所以最多只能读取30个学校(ps:换到第二页url链接没有发生变化,页面源码依然只有前三十个学校...疑惑.jpg)
main()
这个程序是我在上课后,收集资料+改写+参考别人代码得到的最终版本,关于代码的解释基本全都放在了注释部分
参考资料:
format函数:(3条消息) Python的format格式化输出_硬曲奇小屋-CSDN博客_python格式化输出format