R цикл с html_nodes (rvest) не перехватывает все данные - PullRequest
0 голосов
/ 10 мая 2018

Я хотел бы сделать цикл с html_node для перехвата некоторых значений узлов (узлы без текста), то есть у меня есть некоторые значения

library(rvest)
country <- c("Canada", "US", "Japan", "China")

С этими значениями ("Канада", "нас ", ...), я сделал цикл, который создает URL, вставляя каждое значение с" https://en.wikipedia.org/wiki/", после этого, с каждым новым html применяет read_html (i) и последовательности кодов для окончательного перехватаузел с html_nodes ('a.page-link') - да! узел, а не текст - и сохраните этот html_nodes (...) как.character в data.frame (или может быть списком).

dff<- NULL
for ( i in country ) {
url<-paste0("https://en.wikipedia.org/wiki/",i)
page<- read_html(url) 
b <- page%>%
html_nodes ('h2.flow-title') %>%
html_nodes ('a.page-link') %>%
as.character()
dff<- data.frame(b)
}

Проблема в том, что этот код сохраняет только данные из последней страны, то есть запускает первую страну и получает html_nodes (сохраняя ее), но при запуске следующей страны первые данные стираются и заменяютсяэтим новым и так далее, получив в качестве окончательного результата только данные из последней страны. Буду признателен с вашей помощью!

1 Ответ

0 голосов
/ 10 мая 2018

Как сказано в комментарии, эта строка: dff<- data.frame(b) перезаписывает dff на каждой итерации цикла.Решение состоит в том, чтобы создать пустой список и добавить данные в список.
В этом примере элементы списка названы для запрашиваемой страны.

library(rvest)
country <- c("Canada", "US", "Japan", "China")

#initialize the empty list
dff<- list()

for ( i in country ) {
  url<-paste0("https://en.wikipedia.org/wiki/",i)
  page<- read_html(url) 
  b <- page%>%
    html_nodes ('h2.flow-title') %>%
    html_nodes ('a.page-link') %>%
    as.character()
#append new data onto the list
  dff[[i]]<- data.frame(b)
}

Для доступа к данным можно использовать команду dff.$ Canada, или lapply для обработки всего списка.

Примечание. Я запустил ваш пример, который не дал результатов, лучше дважды проверьте идентификаторы узлов.

...