Ошибка индекса вне диапазона: использование Selenium для повторения кликов по страницам в списке элементов на нескольких веб-страницах

Я использую Selenium для перебора списка элементов на последовательных страницах веб-сайта. Все эти элементы имеют одно и то же имя класса.

Вот мой код:

#set up driver
driver = webdriver.Chrome(executable_path='/Applications/chromedriver')

#set variable for webpages to be iterated over
page = 'https://www.bandsintown.com/?came_from=257&page='
urlBucket = []
for i in range (0,3):
    uniqueUrl = page + str(i)
    urlBucket.append(uniqueUrl)

#  iterate over urls    
for i in urlBucket:
    drivers = driver.get(i)
    allelements = len(driver.find_elements_by_class_name('eventList-5e5f25ca'))
    for index in range((allelements)-1):
        driver.find_elements_by_class_name("eventList-5e5f25ca")[index].click()
  
    print allelements

Это дает мне IndexError: list index out of range ошибку. Я пытаюсь понять, почему это так, поскольку у меня уже есть диапазон, равный длине списка элементов минус 1.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
304
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Когда вы первый раз нажимаете на элемент eventList-5e5f25ca, открывается новая страница, где нет ни одного элемента с классом eventList-5e5f25ca. Вы получаете ошибку в строке driver.find_elements_by_class_name("eventList-5e5f25ca")[index], потому что список элементов пуст, и вы пытаетесь щелкнуть элемент с индексом 1.

Если вы хотите получить все события, сначала соберите ссылки, а затем откройте их в отдельном цикле:

base_url = 'https://www.bandsintown.com/?came_from=257&page='

events = []
for i in range(1, 4):
    driver.get(base_url + str(i))

    # get events links
    event_list = driver.find_elements_by_css_selector('div[class^=eventList-] a[class^=event-]')
    # collect href attribute of events in even_list
    events.extend(list(event.get_attribute("href") for event in event_list))

print(len(events))

# iterate throw all events and open them.
for event in events:
    driver.get(event)

Вы также можете избежать использования цикла for i in range(1, 3):, нажав кнопку Посмотреть все.
Если ваша цель очистить данные, а не тестировать, вы можете сделать это намного быстрее, используя библиотеки очистки, такие как , , и т. д. Все данные приходят в виде json с помощью простого запроса.

Большое спасибо. Это работает сейчас. Не могли бы вы объяснить, что здесь означает оператор ^=? Я перерыл все и не нашел ответа. Кроме того, что именно происходит в строке кода events.extend? Является ли «расширение» методом Python? Еще раз спасибо за помощь.

DiamondJoe12 07.04.2019 20:15

Пожалуйста. ^= означает начать с в селекторе css, вы можете найти информацию здесь. extend список методов python, информация здесь.

Sers 07.04.2019 21:19

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