2016-11-17 10 views
1

Ich versuche, eine Tabelle auf der folgenden Website zu kratzen:Web-Scraping Datentabelle mit r rvest

http://www.basketball-reference.com/leagues/NBA_2016.html?lid=header_seasons#all_misc_stats

Die Tabelle mit dem Titel „Verschiedene Statistiken“ und das Problem ist, gibt es mehrere Tabellen auf dieser Webseite und ich weiß nicht, ob ich die richtige identifiziere. Ich habe den folgenden Code versucht, aber alle es schafft, ist ein leerer Datenrahmen:

library(rvest) 
adv <- "http://www.basketball-reference.com/leagues/NBA_2016.html?lid=header_seasons#all_misc_stats" 
tmisc <- adv %>% 
    read_html() %>% 
    html_nodes(xpath = '//*[@id="div_misc_stats"]') %>% 
    html_table() 
tmisc <- data.frame(tmisc) 

Ich habe ein Gefühl, das ich etwas trivial bin fehlt, aber ich habe das nicht durch alle meine Google-Suche gefunden. Jede Hilfe wird sehr geschätzt.

+1

Diese Person versuchte, von der gleichen Seite zu ziehen. Sehen Sie, ob es hilft http://stackoverflow.com/questions/40616357/how-to-scrape-tables-inside-a-comment-day-in-html-with-r –

Antwort

2

Da die Tabelle, die Sie wollen, in einem Kommentar verborgen ist, bis sie von JavaScript aufgedeckt wird, müssen Sie entweder RSelenium verwenden, um das JavaScript auszuführen (was ein bisschen schmerzt), oder die Kommentare analysieren (was immer noch ein Schmerz ist, aber etwas weniger).

library(rvest) 
library(readr) # for type_convert 

adv <- "http://www.basketball-reference.com/leagues/NBA_2016.html?lid=header_seasons#all_misc_stats" 

h <- adv %>% read_html() # be kind; don't rescrape unless necessary 

df <- h %>% html_nodes(xpath = '//comment()') %>% # select comments 
    html_text() %>% # extract comment text 
    paste(collapse = '') %>% # collapse to single string 
    read_html() %>% # reread as HTML 
    html_node('table#misc_stats') %>% # select desired node 
    html_table() %>% # parse node to table 
    { setNames(.[-1, ], paste0(names(.), .[1, ])) } %>% # extract names from first row 
    type_convert() # fix column types 

df[1:6, 1:14] 
## Rk     Team Age PW PL MOV SOS SRS ORtg DRtg Pace FTr 3PAr TS% 
## 2 1 Golden State Warriors* 27.4 65 17 10.76 -0.38 10.38 114.5 103.8 99.3 0.250 0.362 0.593 
## 3 2  San Antonio Spurs* 30.3 67 15 10.63 -0.36 10.28 110.3 99.0 93.8 0.246 0.223 0.564 
## 4 3 Oklahoma City Thunder* 25.8 59 23 7.28 -0.19 7.09 113.1 105.6 96.7 0.292 0.275 0.565 
## 5 4 Cleveland Cavaliers* 28.1 57 25 6.00 -0.55 5.45 110.9 104.5 93.3 0.259 0.352 0.558 
## 6 5 Los Angeles Clippers* 29.7 53 29 4.28 -0.15 4.13 108.3 103.8 95.8 0.318 0.324 0.556 
## 7 6  Toronto Raptors* 26.3 53 29 4.50 -0.42 4.08 110.0 105.2 92.9 0.328 0.287 0.552 
0

Hier ist und eine weitere unordentliche Lösung. Lesen Sie die Seite, speichern Sie es, noch einmal lesen, entfernen Sie die Markierungen Kommentar und dann verarbeiten, um die Seite:

gameUrl <- "http://www.basketball-reference.com/leagues/NBA_2016.html?lid=header_seasons#all_misc_stats" 
gameHtml <- gameUrl %>% read_html() 
#gameHtml %>% html_nodes("tbody") 

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

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

#Read the file back in and process normally 
body<-read_html("nba2.xml") 

#Table 10 was found by looking at all of tables and picking the one of interest 
tableofinterest<-(html_nodes(body, "tbody")[10]) 

rows<-html_nodes(tableofinterest, "tr") 
tableOfResults<-t(sapply(rows, function(x) {html_text(html_nodes(x, "td"))})) 
#find titles from the frist record's attributes 
titles<-html_attrs(html_nodes(rows[1], "td")) 
dfnames<-unlist(titles)[seq(2, 2*length(titles), by=2)] 

#Final results are stored in data frame "df" 
df<-as.data.frame(tableOfResults) 
names(df)<-dfnames 

Dieser Code funktioniert, aber sollte vereinfacht werden! Dies basierte auf einer ähnlichen Lösung, die ich hier gepostet habe: How to get table using rvest()