File size: 2,393 Bytes
1406b5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
const cheerio = require('cheerio');

const cleanText = (text) => text.replace(/\s+/g, ' ').trim();

module.exports.parseStudentData = (html, regNo) => {
  const $ = cheerio.load(html);
  const getText = selector => cleanText($(selector).text()) || 'N/A';

  // Base information
  const data = {
    university: "Bihar Engineering University, Patna",
    registration_no: regNo,
    exam_name: getText('#ContentPlaceHolder1_DataList4_Exam_Name_0'),
    semester: getText('#ContentPlaceHolder1_DataList2_Exam_Name_0'),
    exam_date: getText('#ContentPlaceHolder1_DataList2 td:nth-of-type(2)').split(':').pop(),
    student_name: getText('#ContentPlaceHolder1_DataList1_StudentNameLabel_0'),
    college_name: getText('#ContentPlaceHolder1_DataList1_CollegeNameLabel_0'),
    course_name: getText('#ContentPlaceHolder1_DataList1_CourseLabel_0'),
    sgpa: getText('#ContentPlaceHolder1_DataList5_GROSSTHEORYTOTALLabel_0'),
    publish_date: getText('#ContentPlaceHolder1_DataList3 tr:nth-of-type(2) td').split(':').pop()
  };

  // Subject parser
  const parseSubjects = (selector) => {
    return $(`${selector} tr`).slice(1).map((i, row) => {
      const cells = $(row).find('td');
      return cells.length >= 7 ? {
        subject_code: cleanText(cells.eq(0).text()),
        subject_name: cleanText(cells.eq(1).text()),
        ese: cleanText(cells.eq(2).text()),
        ia: cleanText(cells.eq(3).text()),
        total: cleanText(cells.eq(4).text()),
        grade: cleanText(cells.eq(5).text()),
        credit: cleanText(cells.eq(6).text())
      } : null;
    }).get().filter(Boolean);
  };

  // Subjects and grades
  data.theory_subjects = parseSubjects('#ContentPlaceHolder1_GridView1');
  data.practical_subjects = parseSubjects('#ContentPlaceHolder1_GridView2');

  // Semester grades
  data.semester_grades = $('#ContentPlaceHolder1_GridView3 tr:nth-child(2) td')
    .map((i, cell) => ({
      semester: ["sgpa", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "Cur. CGPA"][i],
      sgpa: cleanText($(cell).text())
    })).get();

  // Failed subjects
  const failedSubjects = [
    ...data.theory_subjects.filter(s => s.grade === 'F').map(s => s.subject_name),
    ...data.practical_subjects.filter(s => s.grade === 'F').map(s => `${s.subject_name} (Practical)`)
  ];
  data.remarks = failedSubjects.length ? `FAIL: ${failedSubjects.join(', ')}` : 'Pass';

  return data;
};