Вопрос или проблема
Мне нужно извлечь подэлементы из класса этого элемента:
<td data-automation-id="horse-racing-section-row-1-meeting-cell" class="meetingCellDesktopMediumAbove_femjjxq">
Подэлементы:
<a href="/horse-racing/australia-nz/ballarat"><div class="meetingCellInternalContainerAbove_fyg3mg0"><div class="leftCellContainer_frjo067"><span class="size14_f7opyze medium_f1wf24vo meetingName_f1jzu4qi" data-automation-id="horse-racing-section-row-1-meeting-name">Ballarat</span>
Я использовал все эти методы, чтобы попытаться найти его:
races = driver.find_elements(By.XPATH, "//td[@class, 'meetingCellDesktopMediumAbove_femjjxq']")
races = driver.find_elements(By.XPATH, "//td[contains(@class, 'meetingCellDesktopMediumAbove_femjjxq')]")
races = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//td[contains(@class, 'meetingCellDesktopMediumAbove_femjjxq')]")))
races = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//td[contains(@class, 'meetingCellDesktopMediumAbove_femjjxq')]")))
races = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//td[@class, 'meetingCellDesktopMediumAbove_femjjxq']")))
races = driver.execute_script('return document.querySelectorAll("td.meetingCellDesktopMediumAbove_femjjxq")')
races = driver.find_elements(By.CSS_SELECTOR, 'meetingCellDesktopMediumAbove_femjjxq')
races = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'td.meetingCellDesktopMediumAbove_femjjxq')))
Когда я пытаюсь:
for race in races:
print(race.text)
Он ничего не возвращает.
Ответ или решение
Чтобы решить проблему с локализацией элемента с помощью Selenium WebDriver, необходимо убедиться в правильности написанных локаторов и проверить, что элемент действительно существует на странице в тот момент, когда вы пытаетесь к нему обратиться.
-
Проверка локатора: Убедитесь, что класс элемента правильно задан. Если ваш класс
meetingCellDesktopMediumAbove_femjjxq
может изменяться динамически, это может быть причиной, по которой Selenium не может его найти. Попробуйте использовать более надежные локаторы, такие какdata-automation-id
.Пример локатора для поиска элемента по
data-automation-id
:races = driver.find_elements(By.XPATH, "//td[@data-automation-id='horse-racing-section-row-1-meeting-cell']")
-
Проверка состояния элемента: Поскольку элементы могут отсутствовать или быть скрытыми во время загрузки страницы, используйте явное ожидание для проверки их наличия или видимости. Попробуйте следующее:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC try: races = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.XPATH, "//td[@data-automation-id='horse-racing-section-row-1-meeting-cell']")) ) except TimeoutException: print("Элементы не найдены в течение заданного времени.")
-
Проверка текста: Если вы успешно находите элементы, но при попытке вывести их текст они возвращают пустую строку, проверьте, содержится ли нужный текст внутри дочерних элементов. Например, текст может находиться внутри
<span>
:for race in races: meeting_name = race.find_element(By.XPATH, ".//span[@data-automation-id='horse-racing-section-row-1-meeting-name']") print(meeting_name.text)
-
Использование CSS селектора: Можно также использовать CSS-селекторы, чтобы найти элемент. Например:
races = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "td[data-automation-id='horse-racing-section-row-1-meeting-cell']")) )
-
Обработка JavaScript: Если ваш код не находит элементы, возможно, они создаются динамически с помощью JavaScript. Попробуйте использовать JavaScript для получения элемента:
races = driver.execute_script('return document.querySelectorAll("td[data-automation-id=\'horse-racing-section-row-1-meeting-cell\']")')
Если все вышеперечисленное не помогло, проверьте, не влияют ли на ваше ожидание структуры страницы и динамического подгрузки данных, а также используйте инструменты разработчика в браузере, чтобы убедиться, что нужные элементы загружены до момента выполнения вашего кода Selenium.