Не удалось преобразовать строку в плавающее исключение - PullRequest
0 голосов
/ 13 января 2020

Недавно я работал над кодом и несколько дней застревал на этой ошибке. В основном, программа принимает текст HTML студентов и преобразует его в таблицу, созданную с помощью DJANGO. Раньше программа работала без проблем, но после недавних школьных изменений в файле HTML Transcript для учащихся она выдает ошибку:

Значение исключения: "Не удалось преобразовать строку в число с плавающей точкой: C ExceptionLocation C: \ Users \ CMPS \ Desktop \ AdvisementSystem \ program \ src \ myproject \ myproject \ myapp \ extractData.py в splitTR, строка 14

Номера курсов для всех переключенных курсов Например, CMPS190 был изменен на CMPS190B, а ENG201 теперь является ENG201B.

Как я могу настроить код, чтобы прочитать, что "B" соответствует номеру курса? Код ниже:

from bs4 import BeautifulSoup
from CourseGrade import *

def splitTr(tr, grade):
    grade.department = tr.find_all('td')[0].text.lstrip()
    grade.course_num = tr.find_all('td')[1].text
    if tr.find_all('td')[2].text == "UG" or tr.find_all('td')[2].text == "GR":
        grade.course_title = tr.find_all('td')[3].text
        grade.grade = tr.find_all('td')[4].text.lstrip()
        grade.creditHour = int(float(tr.find_all('td')[5].text.lstrip()))
    else :
        grade.course_title = tr.find_all('td')[2].text
        grade.grade = tr.find_all('td')[3].text.lstrip()
        grade.creditHour = int(float(tr.find_all('td')[4].text.lstrip()))

def getDataList(student, fileName="Academic Transcript.html"):
    file = open(fileName,'r')
    soup = BeautifulSoup(file,"html.parser")

    studentName = soup.find("a", {"name":"Student Address"})
    if studentName != None:
        student.name = studentName.contents[0]
    else:
        studentName = soup.find("div","staticheaders").contents[0]
        student.name = studentName.split()[1]+ " " + studentName.split()[2]
    print(soup.find('td',attrs={'class':'dddefault','colspan':6}).contents[0])

    table = soup.find('table',attrs={'class':'datadisplaytable'})
    # print(table)
    # table_body = table.findAll('tbody')
    # print(table_body)
    trs = table.find_all('tr')
    count = 0
    term = ''
    department = ''
    course_title = ''
    grade = ''
    for tr in trs:
        if tr.find('span',attrs={'class':'fieldOrangetextbold'}):
            term = tr.span.text
            term = term.replace(":", "")
            term = term.replace("Term", "").lstrip()
            continue
        if tr.find('td',attrs={'class':'dddefault','colspan':4}) or tr.find('td',attrs={'class':'dddefault','colspan':5}):
            grade = CourseGrade()
            splitTr(tr, grade)
            grade.semester_completed = term
            appendValidData(student, grade) 
            count = count + 1

def appendValidData(student, grade):
    if grade.grade == 'A':
        student.gradeList.append(grade)
    if grade.grade == 'B':
        student.gradeList.append(grade)
    if grade.grade == 'C':
        student.gradeList.append(grade)
    if grade.grade == 'P':
        student.gradeList.append(grade)
    if grade.grade == 'TA':
        student.gradeList.append(grade)
    if grade.grade == 'TB':
        student.gradeList.append(grade)
    if grade.grade == 'TC':
        student.gradeList.append(grade)
    if grade.grade == 'TP':
        student.gradeList.append(grade)

def fillData(student,courseT):
    for grade in student.gradeList:
        gradeId = grade.department + grade.course_num
        if gradeId == courseT.courseId :
                courseT.grade = grade.grade
                if grade.semester_completed != "":
                    strList = grade.semester_completed.split(' ',3)
                    courseT.semester = strList[0]
                    if len(strList)>1:
                        courseT.year = strList[1]
                    else :
                        courseT.year = strList[0]
                    grade.isListed = True

1 Ответ

0 голосов
/ 13 января 2020

Я думаю, что ваша проблема в том, что вы набиваете много кода в одной строке. Вот строка, которая выдает ошибку: int(float(tr.find_all('td')[4].text.lstrip())). Вы делаете два преобразования, одно индексирование, два вызова метода и один поиск атрибутов. Постарайтесь избежать этого, так как это действительно трудно читать и отлаживать. Если вы разделите их, вы сможете проверить каждое значение в отладчике и определить ошибку.

Ошибка говорит о том, что вы пытаетесь преобразовать строку в число с плавающей точкой (что недопустимо, если строка не является числом). Этот фрагмент tr.find_all('td')[4].text.lstrip() является строкой, которую вы оборачиваете в плавающий элемент. Я не знаю, что вы пытаетесь сделать, но есть ошибка. Возможно, индекс (4) больше не возвращает число, а букву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...