BeautifulSoup – solo regresa la primera mesa

He estado trabajando con BeautifulSoup últimamente. Estoy tratando de obtener los datos del sitio https://www.pro-football-reference.com/teams/mia/2000_roster.htm . Específicamente, todo lo que quiero es el nombre del jugador y ‘gs’ (juegos iniciados).

Sin embargo, al hacerlo, solo está devolviendo los datos de la primera tabla (‘Iniciadores’). En realidad no estoy interesado en esa tabla superior, quiero la segunda tabla titulada “Lista”.

Aquí está el código que estaba haciendo. Como dije, realmente no quería / necesitaba nada más que el nombre del jugador y los juegos iniciados, pero solo estaba practicando y aprendiendo BeautifulSoup.

import pandas as pd import requests import bs4 alpha = requests.get('https://www.pro-football- reference.com/teams/mia/2000_roster.htm') beta = bs4.BeautifulSoup(alpha.text,'lxml') gama = beta.findAll('th',{'data-stat':'pos'}) position = [th.text for th in gama] position = position[1:] position = list(filter(None, position)) gama = beta.findAll('td',{'data-stat':'player'}) player = [td.text for td in gama] player = player[1:] while 'Defensive Starters' in player: player.remove('Defensive Starters') while 'Special Teams Starters' in player: player.remove('Special Teams Starters') gama = beta.findAll('td',{'data-stat':'age'}) age = [td.text for td in gama] age = list(filter(None, age)) gama = beta.findAll('td',{'data-stat':'gs'}) gs = [td.text for td in gama] gs = list(filter(None, gs)) target = pd.DataFrame( { 'player_name':player, 'position':position, 'gs':gs, 'age':age }) 

¿Alguien ve donde me voy mal? ¿O tal vez una forma alternativa de hacerlo?

Para obtener el contenido de esa tabla, debe utilizar cualquier simulador de navegador, ya que la respuesta de esa parte se genera de forma dinámica. Sin embargo, los datos de la primera tabla pueden ser fácilmente accesibles sin ningún simulador de navegador. Probé el selenium en este caso:

 from bs4 import BeautifulSoup from selenium import webdriver driver = webdriver.Chrome() page_url = "https://www.pro-football-reference.com/teams/mia/2000_roster.htm" driver.get(page_url) soup = BeautifulSoup(driver.page_source, "lxml") table = soup.select(".table_outer_container")[1] for items in table.select("tr"): player = items.select("[data-stat='player']")[0].text gs = items.select("[data-stat='gs']")[0].text print(player,gs) driver.quit() 

Salida parcial:

 Player GS Trace Armstrong* 0 John Bock 1 Tim Bowens 15 Lorenzo Bromell 0 Autry Denson 0 Mark Dixon 15 Kevin Donnalley 16 

Por alguna razón, si encuentra tal error, esta vez no habrá tal opción para ese error:

 from bs4 import BeautifulSoup from selenium import webdriver driver = webdriver.Chrome() page_url = "https://www.pro-football-reference.com/teams/mia/2000_roster.htm" driver.get(page_url) soup = BeautifulSoup(driver.page_source, "lxml") table = soup.select(".table_outer_container")[1] for items in table.select("tr"): player = items.select("[data-stat='player']")[0].text if items.select("[data-stat='player']") else "" gs = items.select("[data-stat='gs']")[0].text if items.select("[data-stat='gs']") else "" print(player,gs) driver.quit()