软科大学排名爬取(可运行) Python网络爬虫与信息提取(北京理工大学—嵩天)
先贴代码
import requests
from bs4 import BeautifulSoup
import bs4def getHTMLText(url):try:r = requests.get(url,timeout = 30)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept: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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
