python - 索引超出范围错误:使用 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。
解决方案
当您第一次单击该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):
通过单击查看全部按钮来避免使用循环。如果您的目标是抓取数据而不是测试,您可以使用请求、beautifulsoup、scrapy
等
抓取库更快地完成。所有数据都使用简单请求以 json 格式提供。
推荐阅读
- android - 数据库存储API和DOM存储API有什么区别
- php - 如何使用 DOMDocument PHP 从网站获取类值
- ms-access - Ms Access ListBox,由vba代码设置时值未更新为所选项目
- model - 导出带有纹理和材质的虚幻引擎模型
- linux - 命令行中施加的时间限制似乎并没有限制运行时间
- npm - 必须安装一个用于 webpack 的 CLI - 无法让 webpack 运行
- ios - 颤振音频播放器播放声音在IOS中不起作用
- typescript - 看不懂`排除
` 在打字稿中正确 - c# - Owin/System.Web.Http.SelfHost - 迁移到 .NET Core 后无法启动
- android - 更改具有透明背景的圆形按钮的颜色