Rvest złomuje wiadomości Google z różną liczbą wierszy

Nov 27 2020

Używam Rvest do notowania Google News.
Jednak od czasu do czasu napotykam brakujące wartości w elemencie „Czas” dla różnych słów kluczowych. Ponieważ brakuje wartości, w rezultacie wystąpi „błąd innej liczby wierszy” dla ramki danych z wyniku usuwania.
Czy w ogóle istnieje możliwość uzupełnienia NA dla tych brakujących wartości?

Poniżej znajduje się przykład kodu, którego używam.

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() 
 )    

Odpowiedzi

1 Dave2e Nov 27 2020 at 21:24

Nie znając dokładnej strony, którą przeglądałeś, wypróbowałem pierwszą stronę z wiadomościami Google.

Na stronie Rvest html_node(bez s) zawsze zwraca wartość, nawet jeśli jest to NA. Dlatego, aby zachować wektory tej samej długości, należało znaleźć wspólny węzeł nadrzędny dla wszystkich żądanych węzłów danych. Następnie przeanalizuj żądane informacje z każdego z tych węzłów.

Zakładając, że węzeł Tytuł jest najbardziej kompletny, przejdź o 1 poziom wyżej xml_parent()i spróbuj pobrać tę samą liczbę węzłów opisu, to nie zadziałało. Następnie wypróbowałem 2 poziomy wyżej, używając xml_parent() %>% xml_parent(), to wydaje się działać.

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)