【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))

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))  

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)

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(' ', ''))

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(' ', ''))

猜你喜欢

转载自blog.csdn.net/JZYshuraK/article/details/125416603