Raspado de la tabla HTML de Wikipedia con imágenes, texto y celdas en blanco con R

MiamiCG

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.

Captura de pantalla de la tabla de wikipedia

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!

Rentrop

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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Raspado de HTML con R y selectorgadget

Raspado de texto html en una tabla con delimitadores que no tienen un patrón claro usando R (rvest)

Raspado de tabla HTML con Ruby y Nokogiri

Tabla de látex con texto envuelto en celdas.

Escalado y centrado de imágenes de diferentes dimensiones, con texto alineado a la derecha en CSS

Tabla HTML con encabezados verticales y celdas de igual ancho

Concatenación de 2 columnas, por elemento, en Excel: valores y texto, omitiendo celdas en blanco (con vba)

¿Cómo puedo codificar una tabla con "celdas controladas individualmente" como en la imagen de ejemplo usando HTML y CSS?

Mostrar imágenes en las celdas de la tabla

Carrusel con imágenes de diferentes anchos y diferentes espacios en blanco: ¿cómo lograr la uniformidad?

Carrusel con imágenes de diferentes anchos y diferentes espacios en blanco: ¿cómo lograr la uniformidad?

Portfolio de imágenes en blanco y negro a color con botón de filtro

Galería de imágenes en HTML con JS y CSS

Reemplazar el valor de la fórmula y el espacio en blanco en las celdas de una columna con cero

El sitio web de raspado web con BeautifulSoup y Selenium no detectará elementos de tabla en la página web

Cómo encontrar las celdas vacías en la tabla de datos y reemplazarlas con 0

crear una tabla de celdas con dos cuadros de lista y un campo de texto editable en gwt

¿Cómo almacenar la publicación de blog php en la base de datos mysql con imágenes y otro formato de texto html?

Eliminando entradas en blanco de la tabla con VBA

Tabla de raspado de HTML local con caracteres Unicode

Tabla de raspado de la web con Python

Leer en la tabla del archivo de texto con un número variable de espacios en blanco como separador

Obtener texto de HTML con los espacios en blanco adecuados

Raspado de tabla html con formato impar y etiquetas <h> </h>

R Shiny: copiar celdas de Excel y pegarlas en la aplicación Shiny y luego crear una tabla de datos con ellas

Altura dinámica para celdas de vista de tabla con imágenes cargadas de forma asíncrona

Altura dinámica para celdas de vista de tabla con imágenes cargadas de forma asíncrona

Raspado con BeautifulSoup: raspado de una columna específica en una tabla, desde una página HTML

Reemplazo de celdas en blanco en un rango con 0