• 【Educoder作业】问题求解——网页数据获取


    【Educoder作业】问题求解——网页数据获取

    做完了有一种重复感,五道题题目难度太平稳了,甚至后面的题还更简单一些。都是一些重复且机械的操作。

    这五个题大题的思路是一模一样的,我就放在一起说了。每个题有每个题的特点,但都可以概括一下。我们先打开 h t m l html html的文件,搜索 < t a b l e > <table> <table>找到我们要的表格位置。
    紧接着我们开始观察代码,有什么特点,什么是可以作为锚点让我们抓到然后提取信息的。
    大体概括就这么个意思,我们挨个看。

    T1 提取某平台学生作业得分

    这个题通过观察代码发现,答案前面总是会有一行汉字最终成绩为,我们就通过 f i n d find find这五个字儿就可以找到成绩了。之后就是一些简单处理就可以拿到答案。

    # -*- coding: utf-8 -*-
    
    import re
    
    #不要改动getHTML函数
    #函数功能:读取txt文件中的HTML代码
    def getHTML(filename):
        f = open(filename,'r')
        html = f.read()
        f.close()
        return html
    
    #不要改动dealGrade函数
    #函数功能:处理分数
    def dealGrade(grade):
        grade = str(grade)
        grade = grade.strip()
        grade = grade.replace(' ','')
        if grade.lower()=='none':
            return None
        try:
            grade = eval(grade)
            if type(grade)==float or type(grade)==int:
                return ('%.1f' % grade)
        except:
            pass
        return grade
        
    def getGradeByName(html, name):
    #********** Begin *********#
    #分析网页内容,提取某学员本次作业最终成绩
        grade = 0
        tables = re.findall(r'<table.*?>(.*?)</table.*?>', html, re.S)
        table = tables[0]
        rows = re.findall(r'<tr.*?>(.*?)</tr.*?>', table, re.S)
        for row in rows :
            if name not in row :
                continue
            lines = re.findall(r'<td.*?>(.*?)</td.*?>', row, re.S)
            for line in lines :
                if '最终成绩' in line :
                    Ridx = line.find(r'</span>')
                    Lidx = line.rfind(r'>', 0, Ridx)
                    Num = '1234567890'
                    i = Lidx
                    while i <= Ridx and line[i] not in Num :
                        i += 1
                    j = i
                    while j <= Ridx and line[j] in Num :
                        j += 1
                    return int(line[i : j])
        return 'None'
    #********** End **********#
    
    path,name=input().split(',')
    html=getHTML(path)
    grade =getGradeByName(html, name)
    print(dealGrade(grade))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    T2 提取某平台学生总成绩

    这个题比较具有普适性。我们发现他在列数上是固定的,我们要的学号和成绩分别在第三个和第七个 t d td td里面,直接通过 f i n d a l l findall findall出来的列表查找即可。
    这个题有坑,注意有同名情况,我们代码里的 b r e a k break break就可以满足这个要求。

    # -*- coding: utf-8 -*-
    import re
    #不要改动getHTML函数
    #函数功能:读取txt文件中的HTML代码
    def getHTML(filename):
        f = open(filename,'r')
        html = f.read()
        f.close()
        return html
    #不要改动dealGradeL函数
    #函数功能:处理分数
    def dealGrade(grade):
        grade = str(grade)
        grade = grade.strip()
        grade = grade.replace(' ','')
        grade = grade.replace('\n', '')
        if grade.lower()=='none':
            return 'None'
        try:
            grade = eval(grade)
            if type(grade)==float or type(grade)==int:
                return ('%.2f' % grade)
        except:
            pass
        return grade
    def getInfoByName(html, name):
    #********** Begin *********#
    #分析网页内容,提取某学生的学号和总得分
        tables = re.findall(r'<table.*?>(.*?)</table.*?>', html, re.S)
        rows = re.findall(r'<tr.*?>(.*?)</tr.*?>', tables[0], re.S)
        stuID, grade, flag = '', 0, False
        cnt = 0
        for row in rows :
            if name not in row :
                continue
            lines = re.findall(r'<td.*?>(.*?)</td.*?>', row, re.S)
            stuid = re.findall(r'<span.*?>(.*?)</span.*?>', lines[2], re.S)
            stuID = stuid[0]
            grades = re.findall(r'<span.*?>(.*?)</span.*?>', lines[6], re.S)
            grade = grades[0]
            grade = dealGrade(grade)
            flag = True
            break;
        if not flag :
            stuID = 'None'
            grade = 'None'
        return stuID, grade
    #********** End **********#
    path,name=input().split(',')
    html=getHTML(path)
    stuID, grade  =getInfoByName(html, name)
    stuID = str(stuID)
    stuID = stuID.strip()
    stuID = stuID.replace(' ','')
    print(str(stuID)+','+str(grade))  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    T3 提取某平台学生活跃度

    我们发现答案前面有总得分,找到总得分即可。

    # -*- coding: utf-8 -*-
    
    import re
    
    #不要改动getHTML函数
    #函数功能:读取txt文件中的HTML代码
    def getHTML(filename):
        f = open(filename,'r')
        html = f.read()
        f.close()
        return html
    
    def getActivitybyName(html, name):
    #********** Begin *********#
    #分析网页内容,提取某学员本次作业最终成绩
        tables = re.findall(r'<table.*?>(.*?)</table.*?>', html, re.S)
        rows = re.findall(r'<tr.*?>(.*?)</tr.*?>', tables[0], re.S)
        activity = 0
        for row in rows :
            if name in row :
                idx = row.find('总得分')
                idx += 4
                Num = '1234567890'
                while row[idx] in Num :
                    activity *= 10
                    activity += int(row[idx])
                    idx += 1
    
        return activity 
    #********** End **********#
        
    path,name=input().split(',')
    html=getHTML(path)
    activity =getActivitybyName(html, name)
    activity = str(activity)
    activity = activity.strip()
    activity = activity.replace(' ','')
    activity = activity.replace('\n', '')
    print(activity)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    T4 获取2012年钱班专业信息

    发现固定第三列,同第二题。

    # -*- coding: utf-8 -*-
    
    import re
    
    #不要改动getHTML函数
    #函数功能:读取txt文件中的HTML代码
    def getHTML(filename):
        f = open(filename,'r')
        html = f.read()
        f.close()
        return html
        
    def getSubject(html, name):
    #********** Begin *********#
    #分析网页内容,提取某学生的专业
        tables = re.findall(r'<table.*?>(.*?)</table.*?>', html, re.S)
        rows = re.findall(r'<tr.*?>(.*?)</tr.*?>', tables[0], re.S)
        subject = ''
        for row in rows :
            if name in row :
                lines = re.findall(r'<td.*?>(.*?)</td.*?>', row, re.S)
                subject = lines[2]
    
        return subject
    #********** End **********#
    
    path,name=input().split(',')
    html=getHTML(path)
    subject = getSubject(html, name)
    subject = subject.strip()
    subject = subject.replace('\n', '')
    subject = subject.replace('   ', '')
    print(subject.replace(' ', ''))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    T5 获取2018年招生小组组长信息

    发现省份和组长还有星星总是在一个 t r tr tr里,直接找就行了。
    发现组长的名字是由两个 s p a n span span括起来的,注意一下即可。

    # -*- coding: utf-8 -*-
    
    import re
    
    #不要改动getHTML函数
    #函数功能:读取txt文件中的HTML代码
    def getHTML(filename):
        f = open(filename,'r')
        html = f.read()
        f.close()
        return html
       
    def getLeaderName(html, prov):
    #********** Begin *********#
    #分析网页内容,提取某学员本次作业最终成绩
        tables = re.findall(r'<table.*?>(.*?)</table.*?>', html, re.S)
        rows = re.findall(r'<tr.*?>(.*?)</tr.*?>', tables[0], re.S)
        leaderName = ''
        for row in rows :
            if prov in row :
                lines = re.findall(r'<td.*?>(.*?)</td.*?>', row, re.S)
                mdl = lines[2]
                Ridx = mdl.find('</span></span>')
                Lidx = mdl.rfind('>', 0, Ridx)
                leaderName = mdl[Lidx + 1 : Ridx]
    
        return leaderName
    #********** End **********#
        
    path,prov=input().split(',')
    html=getHTML(path)
    leaderName =getLeaderName(html, prov)
    leaderName = leaderName.strip()
    leaderName = leaderName.replace('&nbsp;', '')
    print(leaderName.replace(' ', ''))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    C语言学习笔记day2
    河北2022中国农民丰收节 国稻种芯:主会场活动在塔元庄举行
    DIY USB3.0 SM2246XT+双贴闪迪15131颗粒256G固态U盘
    GamingTcUI.dll丢失修复,最全面的GamingTcUI.dll修复指南
    windows局域网传文件5种常用方法
    erp系统设计与开发:独自一人开发一整套erp系统是什么水平?
    『忘了再学』Shell基础 — 8、管道符介绍
    paypal订阅流程及api请求
    云原生系列 三【轻松入门容器基础操作】
    没有公网IP?快解析实现内网穿透
  • 原文地址:https://blog.csdn.net/JZYshuraK/article/details/125416603