Raspar tablas html en marcos de datos R usando el paquete XML

Resuelto Eduardo Leoni asked hace 54 años • 4 respuestas

¿Cómo puedo extraer tablas html usando el paquete XML?

Tomemos, por ejemplo, esta página de Wikipedia sobre la selección brasileña de fútbol . Me gustaría leerlo en R y obtener la tabla "lista de todos los partidos que Brasil ha jugado contra equipos reconocidos por la FIFA" como marco de datos. ¿Cómo puedo hacer esto?

Eduardo Leoni avatar Jan 01 '70 08:01 Eduardo Leoni
Aceptado

…o un intento más corto:

library(XML)
library(RCurl)
library(rlist)
theurl <- getURL("https://en.wikipedia.org/wiki/Brazil_national_football_team",.opts = list(ssl.verifypeer = FALSE) )
tables <- readHTMLTable(theurl)
tables <- list.clean(tables, fun = is.null, recursive = FALSE)
n.rows <- unlist(lapply(tables, function(t) dim(t)[1]))

la tabla elegida es la más larga de la página

tables[[which.max(n.rows)]]
 avatar Dec 04 '2009 20:12
library(RCurl)
library(XML)

# Download page using RCurl
# You may need to set proxy details, etc.,  in the call to getURL
theurl <- "http://en.wikipedia.org/wiki/Brazil_national_football_team"
webpage <- getURL(theurl)
# Process escape characters
webpage <- readLines(tc <- textConnection(webpage)); close(tc)

# Parse the html tree, ignoring errors on the page
pagetree <- htmlTreeParse(webpage, error=function(...){})

# Navigate your way through the tree. It may be possible to do this more efficiently using getNodeSet
body <- pagetree$children$html$children$body 
divbodyContent <- body$children$div$children[[1]]$children$div$children[[4]]
tables <- divbodyContent$children[names(divbodyContent)=="table"]

#In this case, the required table is the only one with class "wikitable sortable"  
tableclasses <- sapply(tables, function(x) x$attributes["class"])
thetable  <- tables[which(tableclasses=="wikitable sortable")]$table

#Get columns headers
headers <- thetable$children[[1]]$children
columnnames <- unname(sapply(headers, function(x) x$children$text$value))

# Get rows from table
content <- c()
for(i in 2:length(thetable$children))
{
   tablerow <- thetable$children[[i]]$children
   opponent <- tablerow[[1]]$children[[2]]$children$text$value
   others <- unname(sapply(tablerow[-1], function(x) x$children$text$value)) 
   content <- rbind(content, c(opponent, others))
}

# Convert to data frame
colnames(content) <- columnnames
as.data.frame(content)

Editado para agregar:

Salida de muestra

                     Opponent Played Won Drawn Lost Goals for Goals against  % Won
    1               Argentina     94  36    24   34       148           150  38.3%
    2                Paraguay     72  44    17   11       160            61  61.1%
    3                 Uruguay     72  33    19   20       127            93  45.8%
    ...
Richie Cotton avatar Sep 09 '2009 12:09 Richie Cotton

Junto rvestcon xml2es otro paquete popular para analizar páginas web html.

library(rvest)
theurl <- "http://en.wikipedia.org/wiki/Brazil_national_football_team"
file<-read_html(theurl)
tables<-html_nodes(file, "table")
table1 <- html_table(tables[4], fill = TRUE)

La sintaxis es más fácil de usar que el xmlpaquete y, para la mayoría de las páginas web, el paquete proporciona todas las opciones que uno necesita.

Dave2e avatar May 13 '2016 00:05 Dave2e