[教育者の宿題] 問題解決 - Web ページのデータ取得
終わってみると繰り返し感があり、5問までの難易度は安定しすぎていて、後の問題はさらに簡単でした。これらはすべて反復的で機械的な操作です。
これら 5 つの大質問の考え方はまったく同じなので、まとめて説明します。それぞれの質問には独自の特徴がありますが、それらはすべて要約できます。 h t m l html を開いてみましょうhtml の文書、検索< /span> <;表> <テーブル> <;table>必要なテーブルの場所を見つけます。
次に、コードを観察し、コードにどのような特徴があるのか、情報を取得して抽出するためのアンカー ポイントとして何が使用できるのかを観察し始めました。
以上が概要です。1 つずつ見ていきましょう。
T1 は特定のプラットフォームで生徒の宿題のスコアを抽出します
コードを観察すると、答えの前に常に漢字の行があることがわかりました。最終的なスコアは です。そして< a i=3> f i n d find を渡します。findこれら 5 つの単語を使用できます結果を見つけてください。その後、簡単な処理を行うだけで答えが得られます。
# -*- 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 は特定のプラットフォーム上の生徒の合計スコアを抽出します
この質問は比較的普遍的です。列の数が固定されていることがわかりました。必要な生徒番号と学年はそれぞれ 3 番目と 7 番目です。 t d td td里面,直接通过 f i n d a l l findall finda ll からリストを検索してください。
この質問には落とし穴があります。同じ名前のシチュエーションが存在することに注意してください。コードには 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 年 Qian クラスに関する専門的な情報を入手する
2番目の質問と同様に、3番目の列が固定されていることがわかります。
# -*- 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、探してください。
チーム リーダーの名前が 2 つの スパン 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(' ', '')
print(leaderName.replace(' ', ''))