#selenium #selenium-webdriver #web-scraping
#selenium #selenium-webdriver #очистка веб-страниц
Вопрос:
Я создаю скрипт .py для автоматизации запросов к хранилищу данных Всемирного банка с использованием Selenium.
Скрипт установит флажки в меню «Страны», «Серия» и «Время». У меня нет проблем с выбором массивов стран.
country_codes = ['AUT', 'BRA', etc.]
for country in country_codes:
country_xpath = '//*[@id="chk[Stat_Ctry_Ext].[List].amp;[' str(country) ']"]'
driver.find_element_by_xpath(country_xpath).click()
Однако при выборе серии возникает NoSuchElementException
ошибка.
driver.find_element_by_xpath('//*[@id="chk[STATS_Series_Ext].[Topic].amp;[UIS.NERA.2.M]"]')
Ответ №1:
Пожалуйста, попробуйте приведенный ниже код и дайте мне знать, если у вас возникнут какие-либо проблемы —
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
action = ActionChains(driver)
driver.get('https://databank.worldbank.org/source/education-statistics')
time.sleep(5)
country_codes = ['AFG', 'AUT', 'BRA']
for country in country_codes:
driver.find_element_by_xpath('//*[@id="chk[Stat_Ctry_Ext].[List].amp;[' country ']"]').click()
# Click on the series tab
driver.find_element_by_xpath('(//a[contains(@title,"Series")])[1]').click()
Series_UIS_NERA_2_M = wait.until(
EC.visibility_of_element_located((By.XPATH, '//*[@id="chk[STATS_Series_Ext].[Topic].amp;[UIS.NERA.2.M]"]')))
driver.find_element_by_xpath('//*[@id="chk[STATS_Series_Ext].[Topic].amp;[UIS.NERA.2.M]"]').click()
Комментарии:
1. Если это произойдет, было бы неплохо, если бы вы могли пометить это как ответ. Чтобы люди поняли, что эта проблема была решена.
2. Пара вопросов: является ли тот факт, что presence_of_element_located() также работает здесь, исключительно потому, что мое соединение достаточно быстрое, чтобы меню уже было видно до истечения времени ожидания? Также: является ли хорошей практикой включение Xpaths, как вы сделали ‘(//a[содержит (@title,»Series»)])[1]’, в отличие от копирования и вставки ‘//*[@id=»panel_STATS_Series_Ext»]/ div[1] / h4 / a’?
3. 1.
presence_of_element_located(
) будут ждать, пока элемент не будет найден в HTML. Если ваше соединение быстрее, то элемент будет загружаться быстрее, иначе он будет ждать до 20 секунд (как мы упоминали при инициализации WebDriverWait. 2. Да, это хорошая практика, поскольку я напрямую ориентируюсь на элемент вместо навигации, подобной ‘//*[@id=»panel_STATS_Series_Ext»]/div[1] / h4 / a». (Лучше не использовать absoluteXPath
в вашем коде, потому что это может не сработать в будущем)4. Отлично. Это очень помогает.