File size: 8,198 Bytes
8257b79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
026f2af
8257b79
 
 
 
 
 
0875fdf
8257b79
 
ac76d42
8257b79
 
 
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
# -*- coding: utf-8 -*-
"""Untitled1.ipynb

Automatically generated by Colaboratory.

Original file is located at
    https://colab.research.google.com/drive/1OpumpFAYHp3dJhfH9ZUWpQRDx9FqOVOd
"""


import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt

def extract_question_options(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    tables = soup.find_all('table', class_='menu-tbl')

    question_ids = []
    chosen_options = []
    option_1_ids = []
    option_2_ids = []
    option_3_ids = []
    option_4_ids = []

    for table in tables:
        question_id = table.find('td', string='Question ID :').find_next('td').text
        chosen_option = table.find('td', string='Chosen Option :').find_next('td').text
        option_1_id = table.find('td', string='Option 1 ID :').find_next('td').text
        option_2_id = table.find('td', string='Option 2 ID :').find_next('td').text
        option_3_id = table.find('td', string='Option 3 ID :').find_next('td').text
        option_4_id = table.find('td', string='Option 4 ID :').find_next('td').text

        status = table.find('td', string='Status :').find_next('td').text
        if 'Not Answered' in status or 'Marked For Review' in status:
            chosen_option = 'Not Attempted'

        question_ids.append(question_id)
        chosen_options.append(chosen_option)
        option_1_ids.append(option_1_id)
        option_2_ids.append(option_2_id)
        option_3_ids.append(option_3_id)
        option_4_ids.append(option_4_id)

    data = {
        'Question ID': question_ids,
        'Chosen Option': chosen_options,
        'Option 1 ID': option_1_ids,
        'Option 2 ID': option_2_ids,
        'Option 3 ID': option_3_ids,
        'Option 4 ID': option_4_ids
    }
    df = pd.DataFrame(data)

    new_data = []
    for _, row in df.iterrows():
        chosen_option = row['Chosen Option']
        question_id = row['Question ID']
        if chosen_option == 'Not Attempted':
            option_id = 'Not Attempted'
        else:
            option_id = row[f'Option {chosen_option} ID']

        new_data.append({'Question ID': question_id, 'My Options(s)': option_id})

    new_df = pd.DataFrame(new_data)
    return new_df

def extract_question_info(data):
    lines = data.split("\n")

    result = []
    skip_row = False

    for line in lines:
        if line:
            if skip_row:
                skip_row = False
                continue

            parts = line.split("\t")
            question_id = parts[2]
            correct_option = ""
            for option in parts[3:]:
                if option != "None of These":
                    correct_option = option
                    break

            result.append({"Question ID": question_id, "Correct Option(s)": correct_option})
            skip_row = True

    df = pd.DataFrame(result)
    return df

def compare_answers(data, url):
    # Call extract_question_info to get the ans_df DataFrame
    ans_df = extract_question_info(data)

    # Call extract_question_options to get the new_df DataFrame
    new_df = extract_question_options(url)

    # Merge the two DataFrames based on the 'Question ID' column
    merged_df = ans_df.merge(new_df, on='Question ID', how='inner')

    # Compare the Correct Option(s) and My Options(s) columns and assign marks
    merged_df['Marks'] = merged_df.apply(lambda row: 4 if row['Correct Option(s)'] == row['My Options(s)']
                                         else (-1 if row['My Options(s)'] != 'Not Attempted' else 0), axis=1)

    # Calculate total marks
    total_marks = len(ans_df) * 4

    # Calculate number of wrong answers
    wrong_answers = len(merged_df[merged_df['Marks'] == -1])

    # Calculate number of right answers
    right_answers = len(merged_df[merged_df['Marks'] == 4])

    # Calculate number of not attempted questions
    not_attempted = len(new_df[new_df['My Options(s)'] == 'Not Attempted'])

    # Calculate marks obtained
    marks_obtained = merged_df['Marks'].sum()

    # Calculate percentage score
    percentage_score = (marks_obtained / total_marks) * 100

    # Create the markdown text
    text = f"Total Marks: {total_marks}\n"
    text += f"Number of Wrong Answers: {wrong_answers}\n"
    text += f"Number of Right Answers: {right_answers}\n"
    text += f"Number of Not Attempted Questions: {not_attempted}\n"
    text += f"Marks Obtained: {marks_obtained}\n"
    text += f"Percentage Score: {percentage_score}\n"

    # Plotting the overall performance
    labels = ['Right Answers', 'Wrong Answers', 'Not Attempted']
    sizes = [right_answers, wrong_answers, not_attempted]
    colors = ['#66BB6A', '#EF5350', '#FFA726']
    plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)
    plt.axis('equal')
    plt.title('Overall Performance')

    return text, merged_df, plt

import gradio as gr

with gr.Blocks(theme='gradio/soft') as demo:
    gr.Markdown("""
    ## FOLLOW THIS STEPS TO EXTRACT THE DATA
    ![Image](https://i.imgur.com/9dzYJZ1.gif)

    """)
    data = gr.Textbox(label="Correct Options in The Website",placeholder=
"""1	Data Science Artificial Intelligence_Eng - PART A	123456789	987654321
987654321	987654322	987654323	987654324	None of These
2	Data Science Artificial Intelligence_Eng - PART A	234567890	123456789
123456789	123456790	123456791	123456792	None of These
3	Data Science Artificial Intelligence_Eng - PART A	345678901	234567890
234567890	234567891	234567892	234567893	None of These
4	Data Science Artificial Intelligence_Eng - PART A	456789012	345678901
345678901	345678902	345678903	345678904	None of These
5	Data Science Artificial Intelligence_Eng - PART A	567890123	456789012
456789012	456789013	456789014	456789015	None of These
6	Data Science Artificial Intelligence_Eng - PART A	678901234	567890123
567890123	567890124	567890125	567890126	None of These
7	Data Science Artificial Intelligence_Eng - PART A	789012345	678901234
678901234	678901235	678901236	678901237	None of These
8	Data Science Artificial Intelligence_Eng - PART A	890123456	789012345
789012345	789012346	789012347	789012348	None of These
9	Data Science Artificial Intelligence_Eng - PART A	901234567	890123456
890123456	890123457	890123458	890123459	None of These
10	Data Science Artificial Intelligence_Eng - PART A	123456789	901234567
901234567	901234568	901234569	901234570	None of These
11	Data Science Artificial Intelligence_Eng - PART A	234567890	123456789
123456789	123456790	123456791	123456792	None of These
12	Data Science Artificial Intelligence_Eng - PART A	345678901	234567890
234567890	234567891	234567892	234567893	None of These
13	Data Science Artificial Intelligence_Eng - PART A	456789012	345678901
345678901	345678902	345678903
.
.
.
.
95 Data Science Artificial Intelligence_Eng - PART A 678901234 567890123
567890123 567890124 567890125 567890126 None of These
96 Data Science Artificial Intelligence_Eng - PART A 789012345 678901234
678901234 678901235 678901236 678901237 None of These
97 Data Science Artificial Intelligence_Eng - PART A 890123456 789012345
789012345 789012346 789012347 789012348 None of These
98 Data Science Artificial Intelligence_Eng - PART A 901234567 890123456
890123456 890123457 890123458 890123459 None of These
99 Data Science Artificial Intelligence_Eng - PART A 123456789 901234567
901234567 901234568 901234569 901234570 None of These
100 Data Science Artificial Intelligence_Eng - PART A 234567890 123456789
123456789 123456790 123456791 123456792 None of These""", lines=5)
    gr.Markdown("![Image](https://i.ibb.co/FVwGm6L/Screenshot-179.png)")
    url = gr.Textbox(label="Link to your Answers URL",placeholder="https://cdn3.digialm.com//per/g28/pub/XXXX/touchstone/AssessmentQPHTMLMode1//XXXXXXXX/XXXXXXXX/XXXXXXXX/XXXXXXXXXXX.html")
    btn = gr.Button(value="Check Your Answer!")
    out = gr.Textbox(value="", label="Output")
    out1 = gr.Plot()
    out2=gr.Dataframe()
    btn.click(compare_answers, inputs=[data, url], outputs=[out,out2,out1])
    gr.Markdown("Made with :heart: by Neelanjan Chakraborty")

if __name__ == "__main__":
    demo.launch(debug= True)