Rvest supprime Google News avec un nombre différent de lignes
J'utilise Rvest pour supprimer Google News.
Cependant, je rencontre de temps en temps des valeurs manquantes dans l'élément "Time" sur différents mots-clés. Puisque les valeurs sont manquantes, il finira par avoir "une erreur de nombre de lignes différent" pour la trame de données du résultat de mise au rebut.
Est-il possible de remplir NA pour ces valeurs manquantes?
Voici l'exemple du code que j'utilise.
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()
)
Réponses
Sans connaître la page exacte que vous regardiez, j'ai essayé la première page d'actualités de Google.
Dans la page Rvest, html_node
(sans les s) retournera toujours une valeur même si elle est NA. Par conséquent, afin de conserver les vecteurs de la même longueur, il fallait trouver le nœud parent commun pour tous les nœuds de données souhaités. Ensuite, analysez les informations souhaitées de chacun de ces nœuds.
En supposant que le nœud Titre est le plus complet, montez d'un niveau avec xml_parent()
et essayez de récupérer le même nombre de nœuds de description, cela n'a pas fonctionné. Puis essayé 2 niveaux en utilisant xml_parent() %>% xml_parent()
, cela semble fonctionner.
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)