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 'cuowu'
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, 'html.parser')
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td') #tr.find_all('td')的简写
ulist.append([tds[0].string, tds[1].string, tds[2].string])
def printUniverList(ulist, num):
print('{:^10}\t{:^6}\t{:^10}'.format('排名', '学校', '总分'))
for i in range(num):
u = ulist[i]
print('{:^10}\t{:^6}\t{:^10}'.format(u[0], u[1], u[2]))
def main():
uinfo = []
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUniverList(uinfo, 20)
main()
其中分为三个模块:
1.从网络获取网页内容(用到requests库)
#这也是爬取网页的基本框架
def getHTMLText(url):
try:
r = requests.get(url, timeout = 30)
r.raise_for_status() #不是200直接except
r.encoding = r.apparent_encoding
return r.text
except:
return 'cuowu'
2.提取内容信息到合适的数据结构,即将内容放到一个列表中(用到bs4)
#所有的信息都封装在tbody中,然后又在里面分tr,每一个tr包含了所有的大学信息,每个tr中的信息又被td所包围
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, 'html.parser')
for tr in soup.find('tbody').children: #把所有的tbod以及他的子代全部遍历出来
if isinstance(tr, bs4.element.Tag): #判断是否为标签 因为有可能是字符串
tds = tr('td') #tr.find_all('td')的简写
ulist.append([tds[0].string, tds[1].string, tds[2].string]) #.string的意思是找到该标签中的字符串属性
3.输出结果
def printUniverList(ulist, num):
print('{:^10}\t{:^6}\t{:^10}'.format('排名', '学校', '总分'))
for i in range(num):
u = ulist[i]
print('{:^10}\t{:^6}\t{:^10}'.format(u[0], u[1], u[2]))
4.主函数部分
def main():
uinfo = [] #存放大学信息
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUniverList(uinfo, 20)
有点瑕疵 明天改进