es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

rvest es una biblioteca de R que se utiliza para extraer información de páginas web. Una de sus funciones clave es la capacidad de raspar (scrape) datos de un iframe dentro de una página web reactiva. También permite raspar una tabla específica dentro de ese iframe.

Estoy tratando de extraer datos (todos los países y años) de una tabla dentro de un sitio web en un iframe. Algunos códigos que he intentado están abajo.

Después de leer varios mensajes aquí, logré obtener la dirección real del sitio web de la tabla dentro del iframe: https://apps7.unep.org/contribution/. He intentado varias formas de extraer los datos, incluyendo varios xpaths y nodos HTML, pero parece que nada funciona. Nunca he trabajado con tablas reactivas antes y realmente agradecería algo de ayuda. Si alguien pudiera proporcionarme el código correcto, sería absolutamente fantástico.

Estaría abierto a utilizar Selenium si es absolutamente necesario, pero no sé mucho al respecto y preferiría rvest si es posible.

Gracias de antemano.

library(rvest)
library(tidyverse)
library(dplyr)

# Esta dirección tiene la tabla dentro de un iframe
url = "https://www.unep.org/about-un-environment/funding-and-partnerships/check-your-contributions"

# Esta tabla obtiene el sitio web del que realmente provienen los datos en el iframe
base_website = url %>%
  read_html(url) %>%
  html_node("iframe") %>%
  html_attr("src")

# Me gustaría obtener los datos de la tabla en el sitio web mencionado anteriormente
my_table = read_html(base_website) %>%
  #extract(1)
  #html_node("body div") %>% 
  html_table()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que ya has extraído la dirección real del sitio web donde se encuentra la tabla de datos, lo cual es un buen comienzo. Sin embargo, extraer datos de un iframe puede resultar complicado utilizando solo rvest, ya que el contenido del iframe suele cargarse de forma asíncrona utilizando JavaScript. Es posible que necesites usar un paquete adicional, como RSelenium, para interactuar con el sitio web y extraer los datos. Aquí tienes un ejemplo de código usando RSelenium:

    “`{r}

    install.packages(“RSelenium”)

    library(RSelenium)
    library(tidyverse)

    iniciar un servidor y un navegador de selenium

    rD <- rsDriver(browser = c(“firefox”))

    navegar hasta el sitio web con el iframe

    remDr <- rD[[“client”]]
    remDr$navigate(“https://www.unep.org/about-un-environment/funding-and-partnerships/check-your-contributions”)

    esperar a que se cargue la tabla

    Sys.sleep(10)

    cambiar al iframe y extraer la tabla

    remDr$switchToFrame(remDr$findElement(using = “css”, “#DataTables_Table_0 iframe”))
    my_table <- read_html(remDr$getPageSource()[[1]]) %>%
    html_table()

    detener el servidor y el navegador de selenium

    remDr$close()
    rD$server$stop()
    “`

    Ten en cuenta que se ha agregado la función Sys.sleep() para dar suficiente tiempo para que se cargue la tabla, pero es posible que necesites ajustar el tiempo según la velocidad de tu conexión a internet. Además, el selector #DataTables_Table_0 utilizado en remDr$findElement() puede cambiar si el sitio web se actualiza, por lo que es posible que necesites inspeccionar el elemento iframe utilizando las herramientas de desarrollo del navegador para encontrar el selector correcto.

    Espero que esto te ayude. Déjame saber si tienes alguna otra pregunta.

Comments are closed.