2016-08-30 27 views
5

Chcę pobrać niektóre dane ze strony Pro Football Reference za pomocą pakietu rvest. Najpierw chwycić wyniki wszystkich rozegranych w 2015 roku z tym adresem http://www.pro-football-reference.com/years/2015/games.htmJak uzyskać tabelę za pomocą rvest()

library("rvest") 
library("dplyr") 

#grab table info 
url <- "http://www.pro-football-reference.com/years/2015/games.htm" 
urlHtml <- url %>% read_html() 
dat <- urlHtml %>% html_table(header=TRUE) %>% .[[1]] %>% as_data_frame() 

Czy to w jaki sposób to zrobić? :)

dat może być trochę posprzątany. Dwie zmienne wydają się mieć puste pola dla nazw. Plus wiersz nagłówka jest powtarzany między każdym tygodniem.

colnames(dat) <- c("week", "day", "date", "winner", "at", "loser", 
        "box", "ptsW", "ptsL", "ydsW", "toW", "ydsL", "toL") 

dat2 <- dat %>% filter(!(box == "")) 
head(dat2) 

Wygląda dobrze!

Teraz spójrzmy na indywidualną grę. Na stronie powyżej kliknij "Boxscore" w pierwszym rzędzie tabeli: 10 września rozgrywana pomiędzy Nową Anglią a Pittsburghiem. To zabiera nas tutaj: http://www.pro-football-reference.com/boxscores/201509100nwe.htm.

Chcę pobrać poszczególne liczby dla każdego gracza (około połowy strony). Na pewno będą to nasze pierwsze dwie linie kodu:

gameUrl <- "http://www.pro-football-reference.com/boxscores/201509100nwe.htm" 
gameHtml <- gameUrl %>% read_html() 

Ale teraz nie mogę wymyślić, jak pobrać konkretny stół, który chcę. Używam gadżetu Selector, aby podświetlić tabelę snapów Patriots. Robię to, klikając stół w kilku miejscach, a następnie "usuwając" pozostałe podświetlone tabele. I skończyć z ścieżce:

#home_snap_counts .right , #home_snap_counts .left, #home_snap_counts .left, #home_snap_counts .tooltip, #home_snap_counts .left

Każda z tych prób zwraca {xml_nodeset (0)}

gameHtml %>% html_nodes("#home_snap_counts .right , #home_snap_counts .left, #home_snap_counts .left, #home_snap_counts .tooltip, #home_snap_counts .left") 
gameHtml %>% html_nodes("#home_snap_counts .right , #home_snap_counts .left") 
gameHtml %>% html_nodes("#home_snap_counts .right") 
gameHtml %>% html_nodes("#home_snap_counts") 

Może spróbujmy użyciu xpath. Wszystkie te próby również zwrócą się, w celu odzyskania tej tabeli? Zwrócę też uwagę, że kiedy robię "Wyświetl źródło strony" w Google Chrome, wydaje mi się, że tabele, które chcę, są komentowane? Oznacza to, że są wpisane na zielono zamiast zwykłego schematu kolorów czerwonego/czarnego/niebieskiego. Tak nie jest w przypadku wyników tabeli wyników, które wyciągnęliśmy jako pierwsze. "Wyświetl źródło strony" dla tego stołu to zwykle schemat kolorów czerwony/czarny/niebieski. Czy zieloność wskazuje na to, co uniemożliwia mi chwytanie tego stołu zliczającego?

Dzięki!

+0

'url <- "http://www.pro-football-reference.com/boxscores/201509100nwe.htm#all_vis_snap_counts" przystawki.count <- url %>% read_html()%>% html_nodes (xpath = '// * [zawiera (concat ("", @ klasa, ""), concat ("", "table_container", ""))]) 'który zwraca element (np.' '{xml_nodeset (1)}' ') listę, ale nie mogę przekonwertować go do tabeli za pomocą' 'html_table (fill = TRUE)' ' –

+0

' 'http: // www .pro-football-reference.com/boxscores/201509100nwe.htm '%>% read_html()%>% html_nodes (xpath =' // komentarz() ')%>% html_text()%>% paste (collapse =' ')%>% read_html()%>% html_node (' table # home_snap_counts ')%>% html_table()%>% {setNames (. [- 1,], paste0 (nazwy (.),. [1,]))}%>% readr :: type_convert() ' – alistaire

Odpowiedz

1

Informacje, których szukasz, są wyświetlane programowo w czasie wykonywania. Jednym z rozwiązań jest użycie RSelenium.
Podczas przeglądania źródła strony internetowej informacje z tabel są przechowywane w kodzie, ale są ukryte, ponieważ tabele są przechowywane jako komentarze. Oto moje rozwiązanie, w którym usuwam znaczniki komentarzy i normalnie przetwarzam stronę.

Zapisałem plik w katalogu roboczym, a następnie odczytałem plik przy pomocy funkcji readLines. Teraz szukam znaczników komentarzy początku i końca html, a następnie je usuwam. Po raz drugi zapiszę plik (pomijając flagi komentarzy), aby ponownie odczytać i przetworzyć plik dla wybranych tabel.

gameUrl <- "http://www.pro-football-reference.com/boxscores/201509100nwe.htm" 
gameHtml <- gameUrl %>% read_html() 
gameHtml %>% html_nodes("tbody") 

#Only save and work with the body 
body<-html_node(gameHtml,"body") 
write_xml(body, "nfl.xml") 

#Find and remove comments 
lines<-readLines("nfl.xml") 
lines<-lines[-grep("<!--", lines)] 
lines<-lines[-grep("-->", lines)] 
writeLines(lines, "nfl2.xml") 

#Read the file back in and process normally 
body<-read_html("nfl2.xml") 
html_table(html_nodes(body, "table")[29]) 

#extract the attributes and find the attribute of interest 
a<-html_attrs(html_nodes(body, "table")) 

#find the tables of interest. 
homesnap<-which(sapply(a, function(x){x[2]})=="home_snap_counts") 
html_table(html_nodes(body, "table")[homesnap]) 

visitsnap<-which(sapply(a, function(x){x[2]})=="vis_snap_counts") 
html_table(html_nodes(body, "table")[visitsnap]) 
+0

Dzięki Dave! Bardzo dobre rozwiązanie. – hossibley