2014-04-25 6 views
1

R을 사용하여 ~ 1,000 개의 URL 목록을 긁습니다. 스크립트는 종종 재현 할 수없는 방식으로 실패합니다. 다시 실행하면 성공할 수도 있고 다른 URL에서 실패 할 수도 있습니다. 이 문제는 인터넷 연결이 일시적으로 끊어 지거나 URL을 스크래핑하는 서버의 일시적인 오류로 인해 문제가 발생할 수 있다고 생각됩니다.R에서 오류가 발생했을 때의 오류 처리

오류가 발생하면 다음 URL로 진행하도록 R 코드를 어떻게 디자인 할 수 있습니까? try 함수를 사용하여 시도했지만이 시나리오에서는 작동하지 않는 것 같습니다.

Test <- try(htmlTreeParse(URL, useInternalNodes = TRUE), silent = TRUE) 
if(inherits(Test, "try-error")) next 

그러나 다음 URL 정지 그냥이 단계 이전 작업 :

HTML <- htmlTreeParse(URL, useInternalNodes = TRUE) 

그런 htmlTreeParse원 '

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이 단계에서 액세스 할 수 있음을 가정 해 봅시다

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

관련 문제