【发布时间】:2015-03-06 03:11:09
【问题描述】:
我想应用循环从 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
【问题讨论】:
-
这里的结果相同。我尝试了这段代码,即使在有效的非循环中也得到了相同的错误消息! > 长度(站点)[1] 7 > stopifnot(长度(站点)== 1)错误:长度(站点)== 1 不正确
-
在这一行:
site <- paste("http://www.countryreports.org/country/",country,".htm", sep="")您正在使用country,在循环版本中,这是一个包含您所有国家/地区的字符向量。您可能想要i,它是您所在国家/地区向量的一个元素。 -
zelite - 这让我更接近 - 谢谢。
-
感谢两位的帮助。我将添加最终的工作代码以供参考-希望对某人有所帮助!