Как очистить таблицу данных, содержащую несколько страниц, с помощью селена?

#selenium #web-scraping #jupyter-notebook

Вопрос:

Я извлекаю статистику НБА из своей учетной записи yahoo fantasy. Ниже приведен код, который я сделал в блокноте jupyter, используя selenium. На каждой странице показано 25 игроков и в общей сложности 720 игроков. Я сделал цикл for, который будет очищать игроков с шагом 25, а не по одному.

 for k in range (0,725,25): Players = driver.find_elements_by_xpath('//tbody/tr/td[2]/div/div/div/div/a') Team_Position = driver.find_elements_by_xpath('//span[@class= "Fz-xxs"]') Games_Played = driver.find_elements_by_xpath('//tbody/tr/td[7]/div') Minutes_Played = driver.find_elements_by_xpath('//tbody/tr/td[11]/div') FGM_A = driver.find_elements_by_xpath('//tbody/tr/td[12]/div') FTM_A = driver.find_elements_by_xpath('//tbody/tr/td[14]/div') Three_Points = driver.find_elements_by_xpath('//tbody/tr/td[16]/div') PTS = driver.find_elements_by_xpath('//tbody/tr/td[17]/div') REB = driver.find_elements_by_xpath('//tbody/tr/td[18]/div') AST = driver.find_elements_by_xpath('//tbody/tr/td[19]/div') ST = driver.find_elements_by_xpath('//tbody/tr/td[20]/div') BLK = driver.find_elements_by_xpath('//tbody/tr/td[21]/div') TO = driver.find_elements_by_xpath('//tbody/tr/td[22]/div')  NBA_Stats = [] for i in range(len(Players)):  players_stats = {'Name': Players[i].text,  'Position': Team_Position[i].text,  'GP': Games_Played[i].text,  'MP': Minutes_Played[i].text,  'FGM/A': FGM_A[i].text,  'FTM/A': FTM_A[i].text,  '3PTS': Three_Points[i].text,  'PTS': PTS[i].text,  'REB': REB[i].text,  'AST': AST[i].text,  'ST': ST[i].text,  'BLK': BLK[i].text,  'TO': TO[i].text} driver.get('https://basketball.fantasysports.yahoo.com/nba/28951/players?status=ALLamp;pos=Pamp;cut_type=33amp;stat1=S_AS_2021amp;myteam=0amp;sort=ARamp;sdir=1amp;count='   str(k))  

Браузер будет переходить постранично после того, как это будет сделано. Я распечатываю результаты. Это всего лишь 1 игрок. Что я сделал не так?

Изображение моих кодов и распечатка результатов

Комментарии:

1. добавьте некоторые задержки с time.sleep() (не предпочтительно) или с явным ожиданием селениумов. Возможно, происходит то, что код выполняется слишком быстро и пытается получить элемент, которого больше нет или который еще не отрисован.

2. еще одна вещь, которую я бы изменил здесь, это то, что похоже, что вы анализируете lt;tablegt; теги. Используйте панд .read_html() . Это намного проще в использовании

3. У меня также есть сильное подозрение, что мы можем получить эти данные через api

Ответ №1:

Трудно понять, в чем здесь проблема, не посмотрев на исходную страницу (можете ли вы указать URL-адрес?), Однако, взглянув на это:

 next = driver.find_element_by_xpath('//a[@id = "yui_3_18_1_1_1636840807382_2187"]')  

«1636840807382 «выглядит как временная метка Javascript, поэтому я бы предположил, что ссылка, которую вы там жестко закодировали, генерируется динамически, поэтому элемент» yui_3_18_1_1_1636840807382_2187 » больше не существует.

Комментарии:

1. Я заметил, что элемент изменится, если он перейдет на следующую страницу. Поэтому я ищу текст по ссылкам, который называется «Следующие 25».