【发布时间】:2017-04-13 10:26:21
【问题描述】:
我正在从网上下载天气数据。为此,我创建了简单的 for 循环,它将带有数据的数据框添加到列表中(一个城市一个列表)。它工作正常,但如果没有数据(网络上没有特定日期的天气状况表),它会返回错误 - 例如到这个 url ("https://www.wunderground.com/history/airport/EPLB/2015/12/25/DailyHistory.html?req_city=Abramowice%20Koscielne&req_statename=Poland")。
Error in Lublin[i] <- url4 %>% read_html() %>% html_nodes(xpath = "//*[@id=\"obsTable\"]") %>% :
replacement has length zero
当错误发生时,我如何放置 if 语句,该语句返回带有 NA(13 个观察值)的行并将其放入列表中?
还有比 for 循环下载所有数据更快的方法吗?
我的代码:
c<-seq(as.Date("2015/1/1"), as.Date("2016/12/31"), "days")
Warszawa <- list()
Wroclaw <- list()
Bydgoszcz <- list()
Lublin <- list()
Gorzow <- list()
Lodz <- list()
Krakow <- list()
Opole <- list()
Rzeszow <- list()
Bialystok <- list()
Gdansk <- list()
Katowice <- list()
Kielce <- list()
Olsztyn <- list()
Poznan <- list()
Szczecin <- list()
date <- list()
for(i in 1:length(c)) {
y<-as.numeric(format(c[i],'%Y'))
m<-as.numeric(format(c[i],'%m'))
d<-as.numeric(format(c[i],'%d'))
date[i] <- c[i]
url1 <- sprintf("https://www.wunderground.com/history/airport/EPWA/%d/%d/%d/DailyHistory.html?req_city=Warszawa&req_state=MZ&req_statename=Poland", y, m, d)
url2 <- sprintf("https://www.wunderground.com/history/airport/EPWR/%d/%d/%d/DailyHistory.html?req_city=Wrocław&req_statename=Poland", y, m, d)
url3 <- sprintf("https://www.wunderground.com/history/airport/EPBY/%d/%d/%d/DailyHistory.html?req_city=Bydgoszcz&req_statename=Poland", y, m, d)
url4 <- sprintf("https://www.wunderground.com/history/airport/EPLB/%d/%d/%d/DailyHistory.html?req_city=Abramowice%%20Koscielne&req_statename=Poland", y, m, d)
url5 <- sprintf("https://www.wunderground.com/history/airport/EPZG/%d/%d/%d/DailyHistory.html?req_city=Gorzow%%20Wielkopolski&req_statename=Poland", y, m, d)
url6 <- sprintf("https://www.wunderground.com/history/airport/EPLL/%d/%d/%d/DailyHistory.html?req_city=Lodz&req_statename=Poland", y, m, d)
url7 <- sprintf("https://www.wunderground.com/history/airport/EPKK/%d/%d/%d/DailyHistory.html?req_city=Krakow&req_statename=Poland", y, m, d)
url8 <- sprintf("https://www.wunderground.com/history/airport/EPWR/%d/%d/%d/DailyHistory.html?req_city=Opole&req_statename=Poland", y, m, d)
url9 <- sprintf("https://www.wunderground.com/history/airport/EPRZ/%d/%d/%d/DailyHistory.html?req_city=Rzeszow&req_statename=Poland", y, m, d)
url10 <- sprintf("https://www.wunderground.com/history/airport/UMMG/%d/%d/%d/DailyHistory.html?req_city=Dojlidy&req_statename=Poland", y, m, d)
url11 <- sprintf("https://www.wunderground.com/history/airport/EPGD/%d/%d/%d/DailyHistory.html?req_city=Gdansk&req_statename=Poland", y, m, d)
url12 <- sprintf("https://www.wunderground.com/history/airport/EPKM/%d/%d/%d/DailyHistory.html?req_city=Katowice&req_statename=Poland", y, m, d)
url13 <- sprintf("https://www.wunderground.com/history/airport/EPKT/%d/%d/%d/DailyHistory.html?req_city=Chorzow%%20Batory&req_statename=Poland", y, m, d)
url14 <- sprintf("https://www.wunderground.com/history/airport/EPSY/%d/%d/%d/DailyHistory.html", y, m, d)
url15 <- sprintf("https://www.wunderground.com/history/airport/EPPO/%d/%d/%d/DailyHistory.html?req_city=Poznan%%20Old%%20Town&req_statename=Poland", y, m, d)
url16 <- sprintf("https://www.wunderground.com/history/airport/EPSC/%d/%d/%d/DailyHistory.html?req_city=Szczecin&req_statename=Poland", y, m, d)
Warszawa[i] <- url1 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Wroclaw[i] <- url2 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Bydgoszcz[i] <- url3 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Lublin[i] <- url4 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Gorzow[i] <- url5 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Lodz[i] <- url6 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Krakow[i] <- url7 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Opole[i] <- url8 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Rzeszow[i] <- url9 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Bialystok[i] <- url10 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Gdansk[i] <- url11 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Katowice[i] <- url12 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Kielce[i] <- url13 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Olsztyn[i] <- url14 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Poznan[i] <- url15 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
Szczecin[i] <- url16 %>%
read_html() %>%
html_nodes(xpath='//*[@id="obsTable"]') %>%
html_table()
}
感谢您的帮助。
【问题讨论】:
-
你可以使用
tryCatch -
提示:参考使用
c作为变量。因为它用于在 R 中创建向量。 -
你也有相当多的重复代码。我认为你可以创建一个函数来做同样的事情,你换出你需要的变量。至于错误,我会遵循@docendo discimus 的建议。
-
@docendodiscimus 我应该在所有
%>% read_html() %>% html_nodes(xpath='//*[@id="obsTable"]') %>% html_table()部分代码中使用tryCatch吗? -
@ErikSchutte 谢谢我会尽量不重复代码:)
标签: r error-handling web-scraping