zoukankan      html  css  js  c++  java
  • 使用正则表达式和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()
    
    

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

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

  • 相关阅读:
    让Controller支持对平铺参数执行@Valid数据校验
    @Validated和@Valid的区别?校验级联属性(内部类)
    Apache和Spring提供的StopWatch执行时间监视器
    Spring方法级别数据校验:@Validated + MethodValidationPostProcessor
    疑问
    第20章 链接详解(笔记)
    nm命令介绍
    使用Euclid算法求最大公约数
    Linux Man手册的使用示例
    VMware12 + Ubuntu16.04 虚拟磁盘扩容
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121920.html
Copyright © 2011-2022 走看看