[Python3爬虫从入门到精通]中国大…

#采用request-bs4路线实现了中国大学排名定向爬虫
# 对中英文混排输出问题进行优化
import requests
from bs4 import BeautifulSoup
import bs4
#import bs4 为了使用它的标签类型定义

def getHTMLText(url) :
    try:
       r = requests.get(url, timeout = 30)
       # print(r.status_code)200为正常,其他信息都有误
       r.raise_for_status()
       r.encoding = r.apparent_encoding
       return r.text
    except:
       return 'Get Failed.'

def fillUnivList(ulist, html):
    soup =BeautifulSoup(html, 'html.parser')
    #print(soup[0:500]) 报错:TypeError: unhashable type:'slice'
    for tr insoup.find('tbody').children:
       if isinstance(tr, bs4.element.Tag) :
       # isinstance(object,classinfo) isinstance函数来判断一个对象是否为某个类型的实例
       #tr有可能不是标签类型,此处判断起过滤的作用
           tds =tr('td')
           # 将所有的td标签放入列表tds中
          # print(tds[0]) 输出:
          # print(tds) 
          ulist.append([tds[0].string, tds[1].string, tds[3].string])
          
def printUnivList(ulist, num):
    #tplt = '{:^10}\t{1:{3}^10}\t{:^10}' 报错:ValueError: cannot switchfrom automatic field numbering to manual fieldspecification
    tplt ='{0:^10}\t{1:{3}^10}\t{2:^10}'
    #其中0 表示第一个填充位置,1 第二个,以此类推
    #:号后面带填充的字符,只能是一个字符,不指定的话默认是用半角空格填充
    #print('{ :^10}\t{ :^6}\t{ :^10}'.format('排名', '学校名称', '总分'))//报错:KeyError: ' '
    #print({:^10}\t{:^6}\t{:^10}.format('排名', '学校名称','总分'))
    print(tplt.format('排名','学校名称', '总分', chr(12288)))
    #chr(12288) 应该是全角空格
    #一个汉字也只算一个字符
    for i inrange(num):
       u = ulist[i]
       print(tplt.format(u[0], u[1], u[2],chr(12288)))

def main():
    uinfo = []
    url ='http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
    html =getHTMLText(url)
    fillUnivList(uinfo,html)
    printUnivList(uinfo, 20) # 20 univ
main()
 
B站学习连接: 【Python网络爬虫与信息提取】.MOOC. 北京理工大学

你可能感兴趣的:(Python3)