2017-11-23 4 views
1

나는 명단의 구성에 따라 팀 성능에 대한 분석을하고 싶기 때문에 모든 대학 축구 팀의 명단 데이터를 가져 오려고합니다.ESPN.com Python web scraping issue

내 스크립트가 첫 번째 페이지에서 작업 중이며 각 팀을 반복하고 각 팀의 로스터 링크를 열 수 있지만 팀의 로스터 페이지에서 실행중인 Beautiful Soup 명령은 계속 색인 오류를 던집니다. HTML을 볼 때 Beautiful Soup의 페이지 소스를 인쇄 할 때 제가 작성한 명령이 아직 작동해야하는 것처럼 보입니다. Chrome의 개발자 도구에 표시되지 않은 것입니다. JS의 일부 인스턴스가 컨텐츠를 제공하는 데 사용됩니까? 그렇다면 셀레늄이이 문제를 해결했다고 생각 했나요?

내 코드 ...에서

import requests 
import csv 
from bs4 import BeautifulSoup 
from selenium import webdriver 

teams_driver = webdriver.Firefox() 
teams_driver.get("http://www.espn.com/college-football/teams") 
teams_html = teams_driver.page_source 
teams_soup = BeautifulSoup(teams_html, "html5lib") 

i = 0 

for link_html in teams_soup.find_all('a'): 
    if link_html.text == 'Roster': 
     roster_link = 'https://www.espn.com' + link_html['href'] 

     roster_driver = webdriver.Firefox() 
     roster_driver.get(roster_link) 
     roster_html = teams_driver.page_source 
     roster_soup = BeautifulSoup(roster_html, "html5lib") 

     team_name_html = roster_soup.find_all('a', class_='sub-brand-title')[0] 
     team_name = team_name_html.find_all('b')[0].text 

     for player_html in roster_soup.find_all('tr', class_='oddrow'): 
      player_name = player_html.find_all('a')[0].text 
      player_pos = player_html.find_all('td')[2].text 
      player_height = player_html.find_all('td')[3].text 
      player_weight = player_html.find_all('td')[4].text 
      player_year = player_html.find_all('td')[5].text 
      player_hometown = player_html.find_all('td')[6].text 

      print(team_name) 
      print('\t', player_name) 

     roster_driver.close() 

teams_driver.close() 

답변

1

당신이 team_name_html의 첫 번째 항목을 선택하려고 할 때 인덱스 오류가 있도록, 1 페이지 (roster_html = teams_driver.page_source)의 HTML을 사용하는 루프 find_all이 빈 목록을 반환하기 때문입니다.

또한 Firefox의 인스턴스를 모두 가질 필요는 없습니다. html이있을 때 드라이버를 닫을 수 있습니다.

teams_driver = webdriver.Firefox() 
teams_driver.get("http://www.espn.com/college-football/teams") 
teams_html = teams_driver.page_source 
teams_driver.quit() 

그러나이 작업을 위해 selenium을 사용할 필요가 없습니다, 당신은 requestsbs4 모든 데이터를 얻을 수 있습니다.

import requests 
from bs4 import BeautifulSoup 

r = requests.get("http://www.espn.com/college-football/teams") 
teams_soup = BeautifulSoup(r.text, "html5lib") 

for link_html in teams_soup.find_all('a'): 
    if link_html.text == 'Roster': 
     roster_link = 'https://www.espn.com' + link_html['href'] 
     r = requests.get(roster_link) 
     roster_soup = BeautifulSoup(r.text, "html5lib") 

     team_name = roster_soup.find('a', class_='sub-brand-title').find('b').text 
     for player_html in roster_soup.find_all('tr', class_='oddrow'): 
      player_name = player_html.find_all('a')[0].text 
      player_pos = player_html.find_all('td')[2].text 
      player_height = player_html.find_all('td')[3].text 
      player_weight = player_html.find_all('td')[4].text 
      player_year = player_html.find_all('td')[5].text 
      player_hometown = player_html.find_all('td')[6].text 
      print(team_name, player_name, player_pos, player_height, player_weight, player_year, player_hometown) 
+0

와우 ... 복사하여 붙여 넣기에 적합합니다. 나는 이것을 며칠 동안보고 있었고 다른 사이트에서 잡으려고 코드를 '리팩토링'했습니다. 그것은 전혀 사이트가 아니 었습니다. 감사. –

+0

누구에게나 일어납니다. 때때로 그것은 당신 앞에 있지만 당신은 그것을 볼 수 없습니다. –