[教育者の宿題] 問題解決 - Web ページのデータ取得

[教育者の宿題] 問題解決 - 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('&nbsp;', '')
print(leaderName.replace(' ', ''))

おすすめ

転載: blog.csdn.net/JZYshuraK/article/details/125416603