Веб-скрейпинг из всплывающего окна с использованием python selenium

Я пытаюсь очистить данные курса с веб-сайта: «https://schedule.msu.edu/». После выбора термина, предмета и нажатия кнопки «Найти курсы» появляется список курсов, и при нажатии на каждый курс, например: (курс AAAS 100 в термине: осень 2019 г., предмет: афроамериканские и африканские исследования), появляется всплывающее окно, и я попытался получить данные из всплывающего окна с помощью селена, он выдает исключение, говорящее «NoSuchElementException: сообщение: нет такого элемента: невозможно найти элемент:». Когда всплывающее окно открывается, это другой URL-адрес, но я не могу понять, как получить данные из всплывающего окна. Буду очень признателен за любую помощь в этом вопросе.

Вот пример кода с использованием селена:

driver = webdriver.Chrome()

driver.get("https://schedule.msu.edu/")


check_box=driver.find_element_by_xpath("//*[@id='MainContent_chkAllonePg']").click()
#clicking on the "terms"
term=driver.find_element_by_xpath("//*[@id='MainContent_ddlTerm']")
term.click()

#selecting a term
term_op=driver.find_element_by_xpath("//*[@id='MainContent_ddlTerm']/option[3]")
term_op.click()

#selecting the subject
elem_sub=driver.find_element_by_xpath("//*[@id='MainContent_ddlSubject']").click()                                    
subject=driver.find_element_by_xpath("//*[@id='MainContent_ddlSubject']/option[1]")
subject.click()

#Clicking on 'Find Courses' button
elem_search=driver.find_element_by_xpath("//*[@id='MainContent_btnSubmit']")
elem_search.click()

#Clicking on a course to get the popup
course=driver.find_element_by_xpath("//*[@id='MainContent_divHeader1_va']/h3[1]/a").click()

#Trying to Scrape from the popup
pop_up=driver.find_element_by_xpath("//*[@id='RepeaterMain']/tbody/tr[1]/td/h3")
pop_up.click()
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 018
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Эти элементы заключены во фрейм, поэтому вам следует сначала переключиться на этот фрейм. Этот код должен работать:

#Clicking on a course to get the popup
course=driver.find_element_by_xpath("//*[@id='MainContent_divHeader1_va']/h3[1]/a").click()

#Trying to Scrape from the popup
#pop_up=driver.find_element_by_xpath("//*[@id='RepeaterMain']/tbody/tr[1]/td/h3")
time.sleep(5)
driver.switch_to.frame(driver.find_element_by_xpath("//*[@id='CourseFrame']"))
#print(driver.page_source)
time.sleep(5)
try:            
    pop_up=WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//*[@id='RepeaterMain']/tbody/tr[1]/td/h3")))
    print(pop_up.text)
except NoSuchElementException:
    pass

выход:

AAAS 390  Special Topics in Black/Africana Studies

Спасибо Huynh, это работает! Любая идея о том, как закрыть всплывающее окно после извлечения данных? Я попытался найти xpath кнопки закрытия и включил ее после оператора print(pop_up.text), но он выдает NoSuchElementException (здесь мы передаем исключение)

cva 01.07.2019 05:54

вы должны переключить рамку, прежде чем нажать кнопку закрытия. примерно так: driver.switch_to.default_content()

Huynh 01.07.2019 06:14

как вы получили xpath как "//*[@id='CourseFrame']"?

cva 13.02.2020 19:37

Внутри всплывающего окна есть рамка. Вы должны переключиться на этот фрейм, прежде чем вы сможете получить доступ к элементам внутри фрейма.

Попробуй это :

#Trying to Scrape from the popup
driver.switch_to.frame(driver.find_element_by_id("CourseFrame"))
pop_up=driver.find_element_by_xpath("//*[@id='RepeaterMain']")
print(pop_up.text)

Спасибо, Ахмед, но он выдает NoSuchFrameException, но я понял, что нужно переключать кадры.

cva 01.07.2019 05:48

Другие вопросы по теме