我使用R来删除大约1,000个网址的列表。脚本经常以不可重现的方式失败;当我重新运行它时,它可能会成功,也可能会在不同的URL上失败。这让我相信这个问题可能是由于我的互联网连接暂时掉线或者是我的网址刮擦服务器上的短暂错误造成的。
如果遇到错误,如何设计我的R代码以继续下一个URL?我尝试过使用try
功能,但这似乎不适合这种情况。
library(XML)
df <- data.frame(URL=c("http://www.google.com/", "http://www.ask.com/", "http://www.bing.com/"))
for (i in 1:nrow(df)) {
URL <- df$URL[i]
# Exception handling
Test <- try(htmlTreeParse(URL, useInternalNodes = TRUE), silent = TRUE)
if(inherits(Test, "try-error")) next
HTML <- htmlTreeParse(URL, useInternalNodes = TRUE)
Result <- xpathSApply(HTML, "//li", xmlValue)
print(URL)
print(Result[1])
}
我们假设在此步骤中可以访问要删除的URL:
Test <- try(htmlTreeParse(URL, useInternalNodes = TRUE), silent = TRUE)
if(inherits(Test, "try-error")) next
但是,在此步骤之前,URL将停止工作:
HTML <- htmlTreeParse(URL, useInternalNodes = TRUE)
然后htmlTreeParse
无法正常工作,R会抛出警告/错误,我的for
循环将会中断。我希望for
循环继续下一个要删除的URL - 我该如何实现?
由于
答案 0 :(得分:1)
试试这个:
library(XML)
library(httr)
df <- c("http://www.google.com/", "http://www.ask.com/", "http://www.bing.com/")
for (i in 1:length(df)) {
URL <- df[i]
response <- GET(URL)
if (response$status_code != 200) next
HTML <- htmlTreeParse(content(response,type="text"),useInternalNodes=T)
Result <- xpathSApply(HTML, "//li", xmlValue)
if (length(Result) == 0) next
print(URL)
print(Result[1])
}
# [1] "http://www.ask.com/"
# [1] "\n \n Answers \n "
# [1] "http://www.bing.com/"
# [1] "Images"
因此,可能存在(至少)两件事:http请求失败,或者响应中没有<li>
标记。这使用GET(...)
包中的httr
来返回整个响应并检查状态代码。它还会检查是否缺少<li>
个标签。