对慕课python爬取大学排名的学习

对慕课崇天老师的python爬取大学排名的学习

这是其中的理解,后面有没有注释的代码,其中数据处理函数的format函数还要再理解下,所以输出就…
一直在改,从开始到改好,将近用了两天,python更多的是对数据的处理吧,出错因为HTMLcontent部分有空白字符,提取汉字用了半天,总结就是要分清python的对象,用什么方法可以得到我要的结果
算是python的入门大礼包

#开发时间 :2021 04  17:26
# CrawUnivRankingA.py

"""
1.从网络上获取大学排名网页的内容
2.提取网页内容信息到数据结构
3.利用数据结构输出结果
"""
import requests
from bs4 import BeautifulSoup
import bs4
import re
# uinfo = []
# url = 'https://www.shanghairanking.cn/rankings/bcur/201811'
# try:
#     r = requests.get ( url , timeout = 30 )
#     r.raise_for_status ( )
#     r.encoding = r.apparent_encoding
#     soup = BeautifulSoup ( r.text , "html.parser" )
#     ty = soup.find ( 'tbody' )      # 返回第一个查找对象tbody标签,
#     print ( type ( ty ) )           #结果是<class 'bs4.element.Tag'>
#     all_trtag = ty.find_all('tr')  #查找所有的tr标签
#     print(type(all_trtag))         #<class 'bs4.element.ResultSet'>
#     #遍历所有的all_tr
#     for item in all_trtag:
#     #     # if re.findall(r'[1-9]?\d',item):
#     #     """
#     #     <td data-v-ab4f125a="">
#     #                     1
#     #                     <!-- --></td>
#     #     """
#     #     ls=[]
#     #     num_lo_sco = item.fin_dall('td')
#         un = item.find('a',class_="name-cn").text
#
#
#     #     for i in num:
#     #         # print ( item )
#     #         ls.append(i if i != ' ')
#     #         print(ls)
#
#         # print(ls[1])
#         # print(type(item.find('td').text))#<class 'str'>
# except:
#     print("爬取失败")
def getHTMLText(url):                           #获取大学排名网页内容函数
    try:
        r = requests.get ( url , timeout = 30 )
        r.raise_for_status ( )
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "爬取失败"
#print(getHTMLText('https://www.shanghairanking.cn/rankings/bcur/2020'))#输出网页内容正确
def fillUnivList(ulist , html):                 #提取信息到合适的数据结构,新建两个参数一个用于存储提取到的数据,另一个用于存未处理的HTML
    soup =BeautifulSoup( html , "html.parser" )
    ty = soup.find ( 'tbody' )                  #返回第一个查找对象tbody标签,
    #print(type(ty))

    # ulist = []
    # list1 = []
    for tr in ty.children:                      #遍历访问tbody的每一个子标签
        if isinstance ( tr , bs4.element.Tag ): #isinstance(object,type) object:表示的是需要判断的对象,type:表示要判断的类型
            #学校名称在tr的孙子节点td->a里,排名和评分在tr的儿子节点td里
            find = []
            for string in tr.strings:
                string = string.replace ( ' ' , '' ).replace ( '\n' , '' ).replace ( ' ' , '' )
                find.append(string)
            ulist.append (find)                 #提取数据还有问题,拿到的数据还是存储还是有问题,怎么处理!!!!!!
    # for j in ulist:
    #     for item in j:
    #         list.append(str ( item ).replace ( ' ' , '' ).replace ( '\n' , '' ).replace ( ' ' , '' ))
            # list.append(list1)
def printUnivList(ulist , num):                                                   #两个参数,一个从外部传入的ulist用于存储选出来的数据,num为院校数目
    print ( "{0:^10}\t{1:{3}^10}\t{2:^10}".format ( "排名" , "学校名称" , "总分" ,chr(12288)) )       #:右边^表示是这个元素居中,10表示这个元素占用10个空格宽度
    for i in range ( num ):
        u = ulist[i]                                                              #数据输出的格式有待改进,数据拿到的也不太对的
        print ( "{0:^10}\t{1:{3}^10}\t{2:^10}".format ( u[0] , u[2] , u[11] ,chr(12288)) )
# def main():
uinfo = []
url = 'https://www.shanghairanking.cn/rankings/bcur/201811'
html = getHTMLText ( url )
fillUnivList ( uinfo , html )
# print(uinfo )
# for item in uinfo:
#     print ( item )
printUnivList ( uinfo , 20 )  # 20 univsitys

# main
""""
# url = 'https://www.shanghairanking.cn/rankings/bcur/201811'
# r = requests.get ( url , timeout = 30 )
# r.raise_for_status ( )
# r.encoding = r.apparent_encoding
# num = 20
# soup =BeautifulSoup( r.text , "html.parser" )
# ulist = []
# ty = soup.find ( 'tbody' )                  #返回第一个查找对象tbody标签,
# print(type(ty))
# for tr in ty.children:                      #遍历访问tbody的每一个子标签
#     if isinstance ( tr , bs4.element.Tag ): #isinstance(object,type) object:表示的是需要判断的对象,type:表示要判断的类型
#         #学校名称在tr的孙子节点td->a里,排名和评分在tr的儿子节点td里
#         find=[]
#         for string in tr.strings:
#             find.append(string)
#         ulist.append (find)
# print ( "{:^10}\t{:^6}\t{:^10}".format ( "排名" , "学校名称" , "总分" ) )  # :右边^表示是这个元素居中,10表示这个元素占用10个空格宽度
# for i in range ( num ):
#     u = ulist[i]                                                              #数据输出的格式有待改进,数据拿到的也不太对的
"""
    排名    	   学校名称   	    总分    
    1     	   清华大学   	   95.3   
    2     	   北京大学   	   78.6   
    3     	   浙江大学   	   73.9   
    4     	  上海交通大学  	   73.1   
    5     	   复旦大学   	    66    
    6     	 中国科学技术大学 	   61.9   
    7     	   南京大学   	   59.8   
    8     	  华中科技大学  	   59.1   
    9     	   中山大学   	   58.6   
    10    	 哈尔滨工业大学  	   57.4   
    11    	   同济大学   	   56.4   
    12    	   武汉大学   	   55.5   
    13    	   东南大学   	   55.3   
    14    	  西安交通大学  	   54.2   
    15    	 北京航空航天大学 	    54    
    16    	   南开大学   	   53.9   
    17    	   四川大学   	   53.3   
    18    	   天津大学   	   52.4   
    19    	  华南理工大学  	   51.8   
    20    	  北京师范大学  	   51.7   

Process finished with exit code 0

#开发时间 :2021 04  17:58
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 ""


def fillUnivList(ulist , html):
    soup = BeautifulSoup ( html , "html.parser" )
    for tr in soup.find ( 'tbody' ).children:
        if isinstance ( tr , bs4.element.Tag ):
            find = []
            for string in tr.strings:
                string = string.replace ( ' ' , '' ).replace ( '\n' , '' ).replace ( ' ' , '' )
                find.append ( string )
            ulist.append ( find )


def printUnivList(ulist , num):
    print ( "{0:^10}\t{1:{3}^10}\t{2:^10}".format ( "排名" , "学校名称" , "总分" ,chr(12288)) )
    for i in range ( num ):
        u = ulist[i]
        print ( "{0:^10}\t{1:{3}^10}\t{2:^10}".format ( u[0] , u[2] , u[11],chr(12288)) )


uinfo = []
url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
html = getHTMLText ( url )
fillUnivList ( uinfo , html )
printUnivList ( uinfo , 20 )  # 20 univs

接下来就是学会更多的爬虫库,分析HTML文档,用python提取数据!
加油!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值