#方法一
import requests from bs4 import BeautifulSoup #对bs4库中的Beautiful类引用 allUniv = []
#获取界面的信息 def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = ‘utf-8‘ return r.text except: return ""
#将获取的信息中有用的存入列表中 def fillUnivList(soup): data = soup.find_all(‘tr‘) for tr in data: ltd = tr.find_all(‘td‘) if len(ltd)==0: continue singleUniv = [] for td in ltd: singleUniv.append(td.string) allUniv.append(singleUniv) def printUnivList(num): print("{:^4}{:^10}{:^5}{:^8}{:^10}{:^10}{:^10}".format("排名","学校名称","省市","总分", "人才培养得分","科学研究得分","社会服务得分")) for i in range(num): u=allUniv[i] print("{:^4}{:^10}{:^5}{:^8}{:^10}{:^10}{:^10}".format(u[0],u[1],u[2],u[3],u[4],u[5],u[6])) def main(): url = ‘http://www.zuihaodaxue.cn/zuihaodaxuepaiming2015_0.html‘ html = getHTMLText(url) soup = BeautifulSoup(html, "html.parser") fillUnivList(soup) printUnivList(310) main()
#方法二
import requests from bs4 import BeautifulSoup #对bs4库中的Beautiful类引用 import bs4 #引入bs4库 #获取界面的信息 def getHTMLText(url) : try: r = requests.get(url,timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: print("获取失败") return ‘‘ #将获取的信息中有用的存入列表中 def fillUnivlist(ulist,html): soup = BeautifulSoup(html,"html.parser")#html的方式保存 #查看源代码,大学排行信息包含在<tbody>,<tr>,<td>标签里面 #先解析<tbody>的位置 for tr in soup.find(‘tbody‘).children: #用isinstance方法检测tr标签,如果tr标签不是bs4库中的Tag类型,过滤 if isinstance(tr,bs4.element.Tag): #查出所有的tr标签后,查出td标签,将所有的td标签存入列表当中 tds = tr(‘td‘)
#在列表中增加需要的对应字段,大学排名,大学名称,大学评分 ulist.append([tds[0].string,tds[1].string,tds[2].string,tds[3].string]) pass #打印出获得的的信息 def printUnivlist(ulist,num): #num为自己想要获取大学的数量 #打印表头 print("{:^10}\t{:^6}\t{:^10}\t{:^10}".format("排名","学校名称","省市","总分")) for i in range(num): u = ulist[i] print("{:^10}\t{:^6}\t{:^10}\t{:^10}".format(u[0],u[1],u[2],u[3])) print(‘Suc‘+str(num)) def main(): uinfo=[] #定义一个存放信息的列表 url=‘http://www.zuihaodaxue.cn/zuihaodaxuepaiming2015_0.html‘ html = getHTMLText(url) fillUnivlist(uinfo,html) printUnivlist(uinfo,310)#查看310个大学 main()
结果
两种方法爬到排名192就中断了,(左图:提示已经追溯到最后;右图:出现IndexError)
(2015年公布的排位只有192位,没有习题要求的310位)
查询IndexError: 索引错误,列表索引超出范围或出现list[0]
方法一(治标不治本):理论上只要跳过index超出范围,或者出现list[0]的那一行就能解决IndexError,代码如下:
for i in range(num): try: u=allUniv[i] print("{:^4}{:^10}{:^5}{:^8}{:^10}{:^10}{:^10}".format(u[0],u[1],u[2],u[3],u[4],u[5],u[6])) except: continue
结果是在排位192的地方终止,没有Error
方法二(根本解决):查看报错行数,找到出错的list,输出长度,如果有不同的list,分别输出一下list的长度
这!个!我!不!会!我什么时候会了再补坑
python-爬取中国大学排名网站信息【IndexError:list index out of range】
原文:https://www.cnblogs.com/Anjoras-bk/p/12884082.html