tablas tabla ejemplos diseƱo crear como bordes avanzado anidadas html r xml parsing web-scraping

ejemplos - tablas en html5



Raspado de tablas html en marcos de datos R utilizando el paquete XML (4)

¿Cómo raspo las tablas html usando el paquete XML?

Tome, por ejemplo, esta página de wikipedia en el equipo de fútbol brasileño . Me gustaría leerlo en R y obtener la tabla "lista de todos los partidos que Brasil jugó contra los equipos reconocidos de FIFA" como un marco de datos. ¿Cómo puedo hacer esto?


... 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 en la página

tables[[which.max(n.rows)]]


El rvest junto con xml2 es 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 paquete xml y para la mayoría de las páginas web o código xml ofrece todas las opciones que necesita.


Otra opción usando Xpath.

library(RCurl) library(XML) theurl <- "http://en.wikipedia.org/wiki/Brazil_national_football_team" webpage <- getURL(theurl) webpage <- readLines(tc <- textConnection(webpage)); close(tc) pagetree <- htmlTreeParse(webpage, error=function(...){}, useInternalNodes = TRUE) # Extract table header and contents tablehead <- xpathSApply(pagetree, "//*/table[@class=''wikitable sortable'']/tr/th", xmlValue) results <- xpathSApply(pagetree, "//*/table[@class=''wikitable sortable'']/tr/td", xmlValue) # Convert character vector to dataframe content <- as.data.frame(matrix(results, ncol = 8, byrow = TRUE)) # Clean up the results content[,1] <- gsub(" ", "", content[,1]) tablehead <- gsub(" ", "", tablehead) names(content) <- tablehead

Produce este resultado

> head(content) 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% 4 Chile 64 45 12 7 147 53 70.3% 5 Peru 39 27 9 3 83 27 69.2% 6 Mexico 36 21 6 9 69 34 58.3%


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:

Muestra de salida

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% ...