Python网络爬虫6之中国大学排名

#通过以下我总结
#如果程序没有输出
#建议你先检查是否连接上了
#也就是链接是否存在,状态是否为200
#在我复制mooc上程序的时候第一次不能运行并且报错no attribute
#原因就在于你压根就没连上去

import requests
from bs4 import BeautifulSoup
import bs4
 
def getHTMLText(url):
    try:
        r = requests.get(url)
        #产生异常信息
        r.raise_for_status()
        #修改编码
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""
    
#提取关键数据,并添加到列表中
#你通过观察大学排名页面
#发现大学名字放在tbody标签下的tr下的td标签中
#所以你要逐一递归式查找
def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    #将tbody下的tr标签做个遍历
    for tr in soup.find('tbody').children:
        #每一个标签的儿子标签有可能是字符串
        #因为大学都封装在标签里
        #所以我们要过滤掉非标签
        #如果tr类型不是bs4库定义的Tag类型将过滤掉
        if isinstance(tr, bs4.element.Tag):
            #将所有td标签存到数组里
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].string, tds[2].string])
#打印出来
def printUnivList(ulist, num):
    #{0}表示format的第一个参数给它
    #{0:8.2f}format的一个参数给它,其占8位的保留小数点2位的浮点数,
    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.com/zuihaodaxuepaiming2018.html'
    html = getHTMLText(url)
    print ("aa")
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 100) # 20 univs
main()

#最后的输出格式不太好
#你可也将以下代码替换printUnivList函数中所有
'''
最后输出结果会很整洁
{1:{3}^10} 1表示位置,{3}表示用第3个参数来填充,^表示居中,10表示占10个位置
这里的第三个参数就是char(12288)
之前是采用西文字符填充,现在采用中文字符填充
tplt = "{0:^10}\t{1:{3}^10}\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)))
'''

你可能感兴趣的:(Python,Reptile)