Я использую 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):
, нажав кнопку Посмотреть все.
Если ваша цель очистить данные, а не тестировать, вы можете сделать это намного быстрее, используя библиотеки очистки, такие как Запросы, красивыйсуп, шероховатый и т. д. Все данные приходят в виде json с помощью простого запроса.
Большое спасибо. Это работает сейчас. Не могли бы вы объяснить, что здесь означает оператор ^=? Я перерыл все и не нашел ответа. Кроме того, что именно происходит в строке кода events.extend? Является ли «расширение» методом Python? Еще раз спасибо за помощь.