2017-02-21 2 views
0

Ich versuche, HTML-Tabellen von den verschiedenen Fußballmannschaften zu kratzen. Hier ist die Tabelle, die ich kratzen möchte, aber ich möchte die gleiche Tabelle von allen Teams abkratzen, um letztendlich eine einzelne CSV-Datei zu erstellen, die die Spielernamen und ihre Daten enthält.Versuch, rvest zu verwenden, um einen Befehl zu wiederholen, um Tabellen von mehreren Seiten zu schaben

http://www.pro-football-reference.com/teams/tam/2016_draft.htm

# teams 
teams <- c("ATL", "TAM", "NOR", "CAR", "GNB", "DET", "MIN", "CHI", "SEA", "CRD", "RAM", "NWE", "MIA", "BUF", "NYJ", "KAN", "RAI", "DEN", "SDG", "PIT", "RAV", "SFO", "CIN", "CLE", "HTX", "OTI", "CLT", "JAX", "DAL", "NYG", "WAS", "PHI") 

# loop 
for(i in teams) { 
    url <-paste0("http://www.pro-football-reference.com/teams/", i,"/2016-snap-counts.htm#snap_counts::none", sep="") 
    webpage <- read_html(url) 

    # grab table 
    sb_table <- html_nodes(webpage, 'table') 
html_table(sb_table) 
head(sb_table) 
    # bind to dataframe 
df <- rbind(df, sb_table) 
} 

Ich bin immer ein Fehler dachte, dass ich sowohl CSS oder XPath und nicht verwenden sollte, aber ich kann nicht herausfinden, wo das Problem genau ist (ich vermute, das html_nodes Befehl). Kann mir jemand helfen, dieses Problem zu beheben?

+0

Wo ist '' df'' aus? –

+0

Basierend auf Ihrer Beispiel-URL sollten die Abkürzungen in 'teams' nicht kleingeschrieben sein? – neilfws

+0

Sie müssen 'df <-data.frame()' außerhalb Ihrer Schleife definieren oder Sie überschreiben es bei jeder Iteration. – Dave2e

Antwort

0

Ich denke, dass Ihre URLs schlecht gebaut sind und zusätzlich, dass die Namen der Teams Groß-und Kleinschreibung beachten. Könnten Sie stattdessen so etwas versuchen?

library(rvest) 
library(magrittr) 

# teams 
teams <- c("ATL", "TAM", "NOR", "CAR", "GNB", "DET", "MIN", "CHI", "SEA", "CRD", "RAM", "NWE", "MIA", "BUF", "NYJ", "KAN", "RAI", "DEN", "SDG", "PIT", "RAV", "SFO", "CIN", "CLE", "HTX", "OTI", "CLT", "JAX", "DAL", "NYG", "WAS", "PHI") 

tables <- list() 
index <- 1 
for(i in teams){ 
    try({ 
    url <- paste0("http://www.pro-football-reference.com/teams/", tolower(i), "/2016_draft.htm") 
    table <- url %>% 
    read_html() %>% 
    html_table(fill = TRUE) 

    tables[index] <- table 

    index <- index + 1 

    }) 
} 

df <- do.call("rbind", tables) 

PS: Ich verstehe nicht, warum diese Frage abgelehnt wird. Es scheint gut formuliert ...

+1

Sie sind erstaunlich! Danke, das hat funktioniert !! –

-1

Ich denke, dass der entsprechende CSS-Selektor in diesem Fall #snap_counts ist. Auch wenn eine Tabelle dort pro Seite ist, können Sie html_node() (Singular, nicht Knoten) verwenden:

url %>% 
    read_html() %>% 
    html_node("#snap_counts") %>% 
    html_table(header = FALSE) 

Da die Tabelle zwei Kopfzeilen hat und einige Header-Zellen Spalten erstrecken, ist es wahrscheinlich am besten header = FALSE zu verwenden. Die ersten beiden Zeilen des Datenrahmens enthalten die Header und Sie können manuell bereinigen (erstellen Sie Ihre eigenen Spaltennamen).

+0

Code funktioniert für mich. Gerne Gründe für Down-Stimmen zu diskutieren :) – neilfws

Verwandte Themen