2015-01-08 3 views
4

Я хотел бы применить петлю для очистки данных от нескольких веб-страниц в R. Я могу очистить данные для одной веб-страницы, однако, когда я пытаюсь использовать цикл для нескольких страниц, я получаю разочаровывающую ошибку. Я провел много времени, но безрезультатно. Любая помощь будет принята с благодарностью!Как я могу использовать цикл для очистки данных веб-сайта для нескольких веб-страниц в R?

Это работает:

########################### 
# GET COUNTRY DATA 
########################### 

library("rvest") 

site <- paste("http://www.countryreports.org/country/","Norway",".htm", sep="") 
site <- html(site) 

stats<- 
    data.frame(names =site %>% html_nodes(xpath="//*/td[1]") %>% html_text() , 
     facts =site %>% html_nodes(xpath="//*/td[2]") %>% html_text() , 
     stringsAsFactors=FALSE) 

stats$country <- "Norway" 
stats$names <- gsub('[\r\n\t]', '', stats$names) 
stats$facts <- gsub('[\r\n\t]', '', stats$facts) 
View(stats) 

Однако, когда я пытаюсь написать это в цикле, я получаю сообщение об ошибке

########################### 
# ATTEMPT IN A LOOP 
########################### 

country<-c("Norway","Sweden","Finland","France","Greece","Italy","Spain") 

for(i in country){ 

site <- paste("http://www.countryreports.org/country/",country,".htm", sep="") 
site <- html(site) 

stats<- 
data.frame(names =site %>% html_nodes(xpath="//*/td[1]") %>% html_text() , 
     facts =site %>% html_nodes(xpath="//*/td[2]") %>% html_text() , 
     stringsAsFactors=FALSE) 

stats$country <- country 
stats$names <- gsub('[\r\n\t]', '', stats$names) 
stats$facts <- gsub('[\r\n\t]', '', stats$facts) 

stats<-rbind(stats,stats) 
stats<-stats[!duplicated(stats),] 
} 

Ошибка:

Error: length(url) == 1 is not TRUE 
In addition: Warning message: 
In if (grepl("^http", x)) { : 
    the condition has length > 1 and only the first element will be used 
+0

Такой же результат здесь. Я пробовал этот код и получал то же сообщение об ошибке даже в не-петле, который сработал! > длина (сайт) [1] 7 > stopifnot (длина (сайт) == 1) Ошибка: длина (сайт) == 1 не TRUE – lawyeR

+1

На этой строке: 'site <- paste (" http://www.countryreports.org/country/",country,".htm ", sep =" ")' вы используете 'country', который в версии цикла представляет собой символьный вектор со всеми вашими странами. Вероятно, вы хотите «i», который является одним из элементов вашего вектора страны. – zelite

+0

zelite - это достало меня гораздо ближе - спасибо. –

ответ

5

Заключительный рабочий код:

########################### 
# THIS WORKS!!!! 
########################### 

country<-c("Norway","Sweden","Finland","France","Greece","Italy","Spain") 

for(i in country){ 

site <- paste("http://www.countryreports.org/country/",i,".htm", sep="") 
site <- html(site) 

stats<- 
data.frame(names =site %>% html_nodes(xpath="//*/td[1]") %>% html_text() , 
    facts =site %>% html_nodes(xpath="//*/td[2]") %>% html_text() , 
     stringsAsFactors=FALSE) 

stats$nm <- i 
stats$names <- gsub('[\r\n\t]', '', stats$names) 
stats$facts <- gsub('[\r\n\t]', '', stats$facts) 
#stats<-stats[!duplicated(stats),] 
all<-rbind(all,stats) 

} 
View(all) 
+1

Действительно ли это работает для вас? Стремясь сделать подобную вещь, так побежал ваш код и получил следующую ошибку: Ошибка в rep (xi, length.out = nvar): пытается реплицировать объект типа «встроенный». Вы инициировали «все» где-то раньше? –

0

Это то, что я сделал. Это не лучшее решение, но вы получите выход. Также это только обходной путь. Я не рекомендую писать вывод таблицы в файл при запуске цикла. Ну вот. После выхода генерируется из stats,

output<-rbind(stats,i) 

, а затем записать таблицу в,

write.table(output, file = "D:\\Documents\\HTML\\Test of loop.csv", row.names = FALSE, append = TRUE, sep = ",") 

#then close the loop 
} 

удачи

1

Просто инициализировать пустой dataframe перед петлей. Я сделал эту проблему, и следующий код работает отлично для меня.

country<-c("Norway","Sweden","Finland","France","Greece","Italy","Spain") 
df <- data.frame(names = character(0),facts = character(0),nm = character(0)) 

for(i in country){ 

    site <- paste("http://www.countryreports.org/country/",i,".htm", sep="") 
    site <- html(site) 

    stats<- 
    data.frame(names =site %>% html_nodes(xpath="//*/td[1]") %>% html_text() , 
       facts =site %>% html_nodes(xpath="//*/td[2]") %>% html_text() , 
       stringsAsFactors=FALSE) 

    stats$nm <- i 
    stats$names <- gsub('[\r\n\t]', '', stats$names) 
    stats$facts <- gsub('[\r\n\t]', '', stats$facts) 
    #stats<-stats[!duplicated(stats),] 
    #all<-rbind(all,stats) 
    df <- rbind(df, stats) 
    #all <- merge(Output,stats) 

} 
View(df) 
Смежные вопросы