driver.find_elements_by_xpath случайно завершается ошибкой - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь очистить данные с помощью Selenium и find_elements_by_xpath, но это происходит случайным образом, и я не понимаю, почему. Вот код:

import time

# Open chrome and go to website
driver = webdriver.Chrome()

url = "https://fortnitetracker.com/events/epicgames_S11_DH_Anaheim_Stage3"
driver.get(url)

i = 1;

while i < 100:
    i = str(i)
    xpath = "/html/body/div[4]/div[2]/div[3]/div[1]/div/div[2]/table/tbody/tr[" + i + "]/td[2]/div"
    player = driver.find_elements_by_xpath(xpath)
    print(player)
    text = player[0].text
    print(text)
    i = int(i)
    i += 1

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:/Users/Kristian/PycharmProjects/Tutorial/getnames.py", line 21, in <module>
    text = player[0].text
IndexError: list index out of range

Однако ошибка не всегда возникает в одной и той же строке. Иногда он получает 13 строк данных, 14, 15, но не более 18. Я понятия не имею, почему это происходит, поскольку xpath всегда корректен. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вы используете find_elements_by_xpath, этот метод всегда возвращает массив. Если элементы найдены, он вернет массив элементов, если нет, он вернет вам пустой массив.

Так что, если элемент не отображается на странице, find_elements_by_xpath будет искать, ничего не найти, и вы получите player = [].

Затем, когда вы сделаете text = player[0].text, он попытается найти элемент с индексом 0 в пустом массиве. Это приведет к IndexError: list index out of range.

Как это исправить?

Простое решение - добавить короткое (например, 0.5 se c) ожидание до search:

time.sleep(0.5)
player = driver.find_elements_by_xpath(xpath)

Это решение будет работать, но оно замедлит ваш скрипт, потому что 0.5 se c будет добавлено для каждой итерации вашего l oop. Более элегантным и предпочтительным решением было бы добавить неявное или явное ожидание, о котором вы можете прочитать в официальном Python Selenium Waits do c.

Удачи, я надеюсь, это помогло.

0 голосов
/ 25 февраля 2020

Я не нашел ответа для использования find_element_by_xpath. Однако, если вы используете driver.find_element_by_css_selector, он работает просто отлично. Так что, если у кого-то есть такая же проблема, это возможное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...