Вы получаете там название экзамена дважды, а не коды экзамена, потому что это то, что вы говорите, чтобы сделать это (небольшая опечатка здесь с наличием exam_name
там дважды):
all_info = list(zip(links, exam_name, exam_name, total_q))
изменить на: all_info = list(zip(links, exam_code, exam_name, total_q))
Несколько вещей, которые меня смущают.
1) Зачем использовать Selnium? Нет необходимости в селене, поскольку данные возвращаются в первоначальном запросе в источнике html. Поэтому я бы просто использовал requests
, поскольку это ускорило бы обработку.
2) Ссылка и код экзамена уже находятся в URL, который вы перебираете. Я бы просто разделил или использовал регулярное выражение для этой строки, чтобы получить ссылку и код. Тогда вам действительно нужно получить название экзамена и количество вопросов.
С учетом сказанного я немного изменил его, чтобы просто получить название экзамена и количество вопросов:
import requests
from bs4 import BeautifulSoup
import pandas as pd
urls = ["https://www.marks4sure.com/210-060-exam.html",
"https://www.marks4sure.com/210-065-exam.html",
"https://www.marks4sure.com/200-355-exam.html",
"https://www.marks4sure.com/9A0-127-exam.html",
"https://www.marks4sure.com/300-470-exam.html",]
links = []
exam_code = []
exam_name = []
total_q = []
for url in urls:
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
links.append(url)
exam_code.append(url.rsplit('-exam')[0].split('/')[-1])
exam_row = soup.select('div[class*="exam-row-data"]')
for exam in exam_row:
if exam.text == 'Exam Name: ':
exam_name.append(exam.find_next_sibling("div").text)
continue
if 'Questions' in exam.text and 'Total Questions' not in exam.text:
total_q.append(exam.text.strip())
continue
all_info = list(zip(links, exam_code, exam_name, total_q))
print(all_info)
df = pd.DataFrame(all_info, columns=["Links", "Exam Code", "Exam Name", "Total Question"])
df.to_csv("data5.csv", index=False)