La tabla que me interesa es la tabla de Wikipedia de restaurantes con estrellas Michelin en Nueva York, y el número de estrellas otorgadas se indica mediante imágenes.
Pude raspar la tabla usando dos pasos (primero obtenga las palabras en las columnas "Nombre" y "Municipio", luego obtenga las etiquetas alt en el cuerpo de la tabla), pero quiero saber si se puede hacer en un solo paso . Pude raspar los datos usando el paquete rvest.
Dado que la función XML :: readHTMLTable no puede leer las páginas de wikipedia, probé el paquete htmltab sin suerte, porque no pude averiguar la función necesaria para el argumento bodyFun. A decir verdad, soy un novato en web scraping ... y funciones.
Preguntas a las que me referí como referencia:
Raspado de tabla html con imágenes usando el paquete XML R
Raspado de tablas html en marcos de datos R utilizando el paquete XML
Aquí está mi código:
library(stringr)
library(rvest)
library(data.table)
url <- "http://en.wikipedia.org/wiki/List_of_Michelin_starred_restaurants_in_New_York_City"
#Scrape the first two columns, restaurant name and borough
name.boro <- url %>% read_html() %>% html_nodes("table") %>% html_table(fill = TRUE)
name.boro <- as.data.table(name.boro[[1]])
name.boro[, 3:length(name.boro) := NULL]
135 * 13 #1,755 cells in first table
#scrape tables for img alt
#note that because I used the "td" node, entries for all cells in all tables were pulled
stars <- url %>% read_html() %>% html_nodes("td") %>% html_node("img") %>% html_attr("alt")
stars
#Make vector of numbers to index each column
df <- vector("list", 13)
for (i in 1:13){
df[[i]] <- seq(i, 1755, 13)
}
#Put everything together
Mich.Guide <- name.boro
Mich.Guide[, c("X2006", "X2007", "X2008", "X2009", "X2010", "X2011", "X2012", "X2013", "X2014", "X2015",
"X2016") := .(stars[unlist(df[3])], stars[unlist(df[4])], stars[unlist(df[5])],
stars[unlist(df[6])], stars[unlist(df[7])], stars[unlist(df[8])],
stars[unlist(df[9])], stars[unlist(df[10])], stars[unlist(df[11])],
stars[unlist(df[12])], stars[unlist(df[13])] )]
¡Gracias!
Puedes probar lo siguiente
require(rvest)
url <- "http://en.wikipedia.org/wiki/List_of_Michelin_starred_restaurants_in_New_York_City"
doc <- read_html(url)
col_names <- doc %>% html_nodes("#mw-content-text > table > tr:nth-child(1) > th") %>% html_text()
tbody <- doc %>% html_nodes("#mw-content-text > table > tr:not(:first-child)")
extract_tr <- function(tr){
scope <- tr %>% html_children()
c(scope[1:2] %>% html_text(),
scope[3:length(scope)] %>% html_node("img") %>% html_attr("alt"))
}
res <- tbody %>% sapply(extract_tr)
res <- as.data.frame(t(res), stringsAsFactors = FALSE)
colnames(res) <- col_names
Ahora tienes la tabla cruda. Te dejo el análisis de las columnas a números enteros y los nombres de las columnas a ti
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras