• 使用正则表达式和urllib模块爬取最好大学排名信息


    题目

    使用urllib模块编程实现爬取网站的大学排名。
    (网址:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html)
    (1)获取网站页面,分析代码结构特征;
    (2)处理页面,提取相关信息;
    (3)解析数据,输出结果。

    代码实现

    Python3

    import urllib.request
    import re
    
    # 获取指定url的源码信息
    def getHTMLText(url):
        try:
            response = urllib.request.urlopen(url, timeout=30)
            html = response.read().decode('utf-8')
            return html
        except:
            return "access the web error!"
        return ""
    
    # 根据具体结构匹配需要的排名信息,最终以列表的形式返回
    def fullTextToSchoolList(html):
        # 正则匹配所有学校名称
        reg2 = r'<td><div align="left">(.*?)</div></td>'
        # 匹配排名信息
        reg = r'<td>(.*?)</td>'
        reg = re.compile(reg)
        reg2 = re.compile(reg2)
        ulists=re.findall(reg,html)
        unames=re.findall(reg2,html)
        # 将学校名称替换到一个list中
        i=1
        j=0
        while i < len(ulists):
            ulists[i]=unames[j]
            j=j+1
            i=i+4
        # 返回学校排名信息的列表
        return ulists
    
    # 格式化输出结果
    def printSchoolList(ulist):
        print("{:^9}	{:^13}	{:^10}	{:^6}".format("排名", "学校名称","省市","总分"))
        print('========================================================================')
        i=0
        while i < len(ulist):
            rank = ulist[i] # 排名
            uname = ulist[i+1] # 学校名
            city = ulist[i+2] # 所在城市
            totalScore = ulist[i+3] # 总评分
            print("{:^10}	{:^13}	{:^10}	{:^6}".format(rank, uname, city,totalScore)) # 格式化输出
            i=i+4
    
    # main函数
    def main():
        url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
       
        html = getHTMLText(url)
        ulist = fullTextToSchoolList(html)
        printSchoolList(ulist)
    # 执行main函数
    if __name__ == '__main__':
        main()
    

    执行结果

    在这里插入图片描述
    其实使用BeautifulSoup模块实现起来更简单,更容易定位排名信息并获取指定标签体的内容。

    另一种使用BeautifulSoup库爬取排名

    url = "http://www.zuihaodaxue.cn/BCSR/jisuanjikexueyujishu2019.html"URL变成了2019的。这个最后爬取的内容和上面的一个是不同的。

    代码实现

    """
    定向爬取最好大学计算机展业排名信息,并输出到控制台
    1. getHTMLText(url)
    2. fullTextToSchoolList
    3. printSchoolList
    """
    from bs4 import BeautifulSoup
    import requests
    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 "access the web error!"
        return ""
    
    # 将提取后的结果追加到ulist列表中去
    def fullTextToSchoolList(ulist,html):
        soup = BeautifulSoup(html,"html.parser")
        for tr in soup.find('tbody').children:
            if isinstance(tr,bs4.element.Tag):
                tds = tr('td')
                try:
                    td0 = tds[0].string
                    td2 = tds[2].string
                    td3 = tds[3].string
                    ulist.append([td0,td2,td3])
                except:
                    pass
    
    
    def printSchoolList(ulist,num):
        print("{:^10}	{:^6}	{:^10}".format("排名","百分段","学校名称"))
        for i in range(num):
            u = ulist[i]
            print("{:^10}	{:^13}	{:^10}".format(u[0], u[1], u[2]))
    
    
    def main():
        uinfo = []
        url = "http://www.zuihaodaxue.cn/BCSR/jisuanjikexueyujishu2019.html"
        html = getHTMLText(url)
        fullTextToSchoolList(uinfo,html)
        printSchoolList(uinfo,20) # 只输出前20学校
    
    if __name__ == '__main__':
        main()
    
    

    输出结果
    在这里插入图片描述

    以上有错误的地方,欢迎评论指出!!!

  • 相关阅读:
    ecshop中关于语言配置项的管理
    ecshop中猜你喜欢的原理
    CSS之Position详解(自cnblogs)
    包装类
    for循环的另一种写法
    date.calendar学习总结
    java对MySql数据访问
    java中对MySql的配置
    小程序在js里获取控件的两种方式
    样式一直没生效,发现css没加前面的小点!!!
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181377.html
Copyright © 2020-2023  润新知