2017-11-23 24 views
1

私は、チームの成績を分析するために、自分の名簿の構成に基づいて分析を実行したいので、すべての大学のフットボールチームのロスターのデータを取得しようとしています。ESPN.com Python web scraping issue

私のスクリプトは最初のページで作業しており、各チームを繰り返して各チームのロースターリンクを開くことができますが、私がチームのロスターページで実行している美しいスープコマンドはインデックスエラーを投げかけています。私がHTMLを見ると、美しいスープからページソースを印刷するときに、私が書いているコマンドがまだうまくいくかのように思えます。私はChromeの開発者ツールには表示されません。 JSのインスタンスがコンテンツの配信に使用されていますか?もしそうなら、私はセレンがこれを回避したと思った?あなたのループのためにあなたは、1ページ目(roster_html = teams_driver.page_source)のHTMLを使用しているので、あなたはteam_name_htmlの第一項目を選択しようとすると、インデックスのエラーを取得するには

私のコード...

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

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

誰にでも起こります。時にはそれはあなたの前にありますが、あなたはそれを見ることはできません。 –