在看老教程过程中发现网站和课程中讲的有所不一样了,在此附上最新网站链接:【软科排名】2023年最新软科中国大学排名|中国最好大学排名
,然而在实现过程中又遇到了如Replacement index 4 out of range for positional args tuple、unsupported format string passed to N
oneType.__format__等问题,昨天找了很久都没找到解决办法,今天终于找到了;这个问题unsupported format string passed to NoneType.__format__这篇帖子的两位老哥写的很详细了,在此附上链接:https://blog.csdn.net/qdabuliuq/article/details/120604353
问题解决:TypeError: unsupported format string passed to NoneType.__format__-CSDN博客
关于第一个问题Replacement index 4 out of range for positional args tuple,发现是自己在format格式中的范围放大了,也就是元组指数超过范围。
其实就是在print那部分函数中tplt中{}中括号的范围大了,把4改成3就好了,(我就是个小白,,,,),
import requests
from bs4 import BeautifulSoup
import bs4
def get_html(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ''
# 构造获取大学排名信息, 提取html中的关键信息加到ulist中
def parse_html(ulist, html):
soup = BeautifulSoup(html, "html.parser") # 创建BeautifulSuop对象
# 首先找到tbody ,找到所有大学的相关信息,并遍历tbody的孩子标签
for tr in soup.find('tbody').children:
# 过滤tr的类型
if isinstance(tr, bs4.element.Tag):
# 找到每一所大学的所有td标签
a=tr('a')
tds = tr.find_all('td')
ulist.append([tds[0].text.strip(), a[0].text.strip(), tds[2].text.strip()])
def print_univlist(ulist, num):
# 格式化输出 chr(12288),中文填充
tplt = "{0:<10}{1:{4}<15}{2:<10}"
print(tplt.format('排名', '学校名称', '地区', 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/2020"
html = get_html(url)
parse_html(uinfo, html)
print_univlist(uinfo,20)
main()
最后附上最终代码:
# UNIV RANK
import requests
from bs4 import BeautifulSoup
import bs4
def get_html(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ''
# 构造获取大学排名信息, 提取html中的关键信息加到ulist中
def parse_html(ulist, html):
soup = BeautifulSoup(html, "html.parser") # 创建BeautifulSuop对象
# 首先找到tbody ,找到所有大学的相关信息,并遍历tbody的孩子标签
for tr in soup.find('tbody').children:
# 过滤tr的类型
if isinstance(tr, bs4.element.Tag):
# 找到每一所大学的所有td标签
a=tr('a')
tds = tr.find_all('td')
ulist.append([tds[0].text.strip(), a[0].text.strip(), tds[2].text.strip()])
def print_univlist(ulist, num):
# 格式化输出 chr(12288),中文填充
tplt = "{0:^10}\t{1:{3}^15}\t{2:^10}"
print(tplt.format('排名', '学校名称', '地区', 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/2020"
html = get_html(url)
parse_html(uinfo, html)
print_univlist(uinfo,20)
main()
tips:tplt中的\t是十分有作用的!要不然对其也会有问题的