首页 > 解决方案 > 索引超出范围错误:使用 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。

标签: pythonseleniumrange

解决方案


当您第一次单击该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 格式提供。


推荐阅读