scraping hacer con como r dataframe web-scraping rvest

hacer - tabla de datos de web scraping con r rvest



rvest vignette (2)

Aquí hay otra solución desordenada. Lea la página, guárdela, vuelva a leerla, elimine los marcadores de comentarios y luego procese la página:

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

¡Este código funciona, pero debe simplificarse! Esto se basó en una solución similar que publiqué aquí: Cómo obtener una tabla usando rvest ()

Estoy tratando de raspar una mesa del siguiente sitio web:

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

La tabla se titula "Estadísticas diversas" y el problema es que hay varias tablas en esta página web y no sé si estoy identificando la correcta. Intenté el siguiente código, pero todo lo que crea es un marco de datos en blanco:

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)

Tengo la sensación de que me estoy perdiendo algo trivial, pero no he encontrado esto en todas mis búsquedas de Google. Cualquier ayuda es muy apreciada.


Dado que la tabla que desea está oculta en un comentario hasta que se revela por JavaScript, o necesita utilizar RSelenium para ejecutar el JavaScript (lo cual es un poco molesto), o analizar los comentarios (lo cual es todavía un problema, pero un poco menos) .

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