Rvest eliminando noticias de Google con diferente número de filas

Nov 27 2020

Estoy usando Rvest para eliminar las noticias de Google.
Sin embargo, encuentro valores faltantes en el elemento "Tiempo" de vez en cuando en diferentes palabras clave. Como faltan los valores, terminará teniendo un "error de número diferente de filas" para el marco de datos del resultado del desguace.
¿Hay alguna forma de completar NA para estos valores faltantes?

A continuación se muestra el ejemplo del código que estoy usando.

html_dat <- read_html(paste0("https://news.google.com/search?q=",Search,"&hl=en-US&gl=US&ceid=US%3Aen"))

  dat <- data.frame(Link = html_dat %>%
                  html_nodes('.VDXfz') %>% 
                  html_attr('href')) %>% 
  mutate(Link = gsub("./articles/","https://news.google.com/articles/",Link))

  news_dat <- data.frame(
   Title = html_dat %>%
   html_nodes('.DY5T1d') %>% 
   html_text(),
   Link = dat$Link,
   Description =  html_dat %>%
   html_nodes('.Rai5ob') %>% 
   html_text(),
   Time =  html_dat %>%
   html_nodes('.WW6dff') %>%
   html_text() 
 )    

Respuestas

1 Dave2e Nov 27 2020 at 21:24

Sin saber la página exacta que estaba viendo, probé la primera página de noticias de Google.

En la página de Rvest, html_node(sin s) siempre devolverá un valor incluso si es NA. Por lo tanto, para mantener los vectores con la misma longitud, se necesitaba encontrar el nodo padre común para todos los nodos de datos deseados. Luego, analice la información deseada de cada uno de esos nodos.

Suponiendo que el nodo Título está más completo, suba 1 nivel xml_parent()e intente recuperar el mismo número de nodos de descripción, esto no funcionó. Luego probé 2 niveles usando xml_parent() %>% xml_parent(), esto parece funcionar.

library(rvest)

url <-"https://news.google.com/topstories?hl=en-US&gl=US&ceid=US:en"
html_dat <- read_html(url)

Title = html_dat %>%  html_nodes('.DY5T1d') %>%   html_text()

# Link = dat$Link
Link = html_dat %>%  html_nodes('.VDXfz') %>%   html_attr('href') 
Link <-  gsub("./articles/", "https://news.google.com/articles/",Link)

#Find the common parent node 
#(this was trial and error) Tried the parent then the grandparent
Titlenodes <- html_dat %>%  html_nodes('.DY5T1d') %>% xml_parent()  %>% xml_parent() 
Description =  Titlenodes %>%  html_node('.Rai5ob') %>%  html_text()
Time =  Titlenodes %>%  html_node('.WW6dff') %>%   html_text() 
 
answer <- data.frame(Title, Time, Description, Link)