1 import requests 2 from bs4 import BeautifulSoup 3 import bs4 4 def gethtmltext(url): #获取html内容,利用try和except框架可以抛出异常 5 try: 6 r = requests.get(url,timeout=30) #获取url,时间限制为30秒 7 r.raise_for_status() #检查连接状态是否为200,即正常连接,如果为否则抛出except异常 8 r.encoding=r.apparent_encoding #确定编码 9 return r.text #返回为html的内容 10 except: 11 return '' 12 13 14 def fillunivlist(ulist,html): #解析html内容,提取所需数据 ulist是一个空列表,用来存取解析出来的所需数据 15 soup = BeautifulSoup(html,'html.parser') #利用beautifulsoup的html.parser来解析r.text 16 for tr in soup.find('tbody').children: #通过分析发现所需排序,学校名称,总分存在于tbody标签类的tr标签中的td标签 .children是查找tbody的子类 17 if isinstance(tr,bs4.element.Tag): #因为tr标签包含其他string,而我们所需要的只是bs4.element.Tag标签类型,所以用isinstance(obj,class)作一个判断 18 tds = tr('td') #若判断为真则 执行查找tr标签中的td标签,并赋值给tds 19 ulist.append([tds[0].string,tds[1].string,tds[2].string]) #将tds的数据追加给ulist 20 21 def printunivlist(ulist,num): #格式化输出内容 22 print('{:^10}\t{:^6}\t{:^10}'.format('排名','学校名称','总分')) 23 for i in range(num): 24 u=ulist[i] 25 print('{:^10}\t{:^6}\t{:^10}'.format(u[0],u[1],u[2])) 26 27 28 def main(): #定义一个主函数,实现具体抓取并输出 29 uinfo = [] 30 url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html' 31 html = gethtmltext(url) 32 fillunivlist(uinfo,html) 33 printunivlist(uinfo,20) 34 35 main()
效果图如下: