【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年钱班专业信息
发现固定第三列,同第二题。文章来源:https://www.toymoban.com/news/detail-790296.html
# -*- 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括起来的,注意一下即可。文章来源地址https://www.toymoban.com/news/detail-790296.html
# -*- 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(' ', '')
print(leaderName.replace(' ', ''))
到了这里,关于【Educoder作业】问题求解——网页数据获取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!