行数が異なるGoogleニュースを破棄する
Nov 27 2020
私はグーグルニュースをスクラップするためにRvestを使用しています。
ただし、さまざまなキーワードで要素「Time」に値が欠落していることがあります。値が欠落しているため、廃棄結果のデータフレームに対して「異なる行数エラー」が発生します。
これらの不足している値のNAを入力する方法はありますか?
以下は私が使用しているコードの例です。
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()
)
回答
1 Dave2e Nov 27 2020 at 21:24
あなたが見ている正確なページを知らずに、私は最初のグーグルニュースページを試しました。
Rvestページでは、html_node
(sなしで)NAであっても常に値を返します。したがって、ベクトルを同じ長さに保つために、必要なすべてのデータノードに共通の親ノードを見つける必要がありました。次に、これらの各ノードから必要な情報を解析します。
タイトルノードが最も完成していると仮定して、1レベル上に移動しxml_parent()
、同じ数の説明ノードを取得しようとすると、これは機能しませんでした。次にxml_parent() %>% xml_parent()
、を使用して2レベル上に試しましたが、これは機能しているようです。
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)