Ошибка индексации вне диапазона: использование селена для повторения нажатий на страницы в списке элементов на нескольких веб-страницах - PullRequest
1 голос
/ 07 апреля 2019

Я использую 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. Любая помощь приветствуется!

1 Ответ

1 голос
/ 07 апреля 2019

При первом щелчке элемента 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 с использованием простого запроса.

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