2014-04-25 60 views
1

我正在使用R来抓取约1,000个URL的列表。剧本经常以不可复制的方式失败;当我重新运行它时,它可能会成功,或者可能会在另一个URL中失败。这使我相信,问题可能是由于我的互联网连接暂时丢失或服务器的URL出现短暂错误导致的。在R中处理气质错误

如何设计我的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韩元” t工作,R会发出警告/错误,并且我的for循环将会中断。我想让for循环继续到下一个被刮掉的URL - 我该如何完成这个?

感谢

回答

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>标签。这在httr包中使用GET(...)来返回整个响应并检查状态码。它还检查是否存在<li>标签。

+0

是的,这似乎工作,太棒了!谢谢 – Rez99