2014-02-10 5 views
6

페이지를 웹 스크래핑하려고합니다. 그러나 파서가 "HTTP 리소스를로드하지 못함"때문에 때때로 루프가 작동하지 않습니다. 문제는 페이지가 내 브라우저에로드되지 않으므로 코드에 문제가 없다는 것입니다.htmlParse 오류 처리 (HTTP 리소스로드 실패)

그러나 오류가 발견 된 각 페이지에 대한 예외를 생성 한 후 프로세스를 다시 시작해야하는 것은 매우 귀찮습니다. if 조건을 넣는 방법이 있는지 궁금합니다. 같은 오류가 발생하는 경우 다음 단계에서 루프를 다시 시작합니다.

나는 htmlParse에 대한 도움말 페이지를 찾았으며 오류 인수가 있지만 사용 방법을 알 수 없습니다. 내 if 조건에 대한 아이디어?

if(require(RCurl) == F) install.packages('RCurl') 
if(require(XML) == F) install.packages('XML') 
if(require(seqinr) == F) install.packages('seqinr') 

for (i in 575:585){ 
    currentPage <- i # define pagina inicial da busca 
# Link que ser? procurado 

link <- paste("http://www.cnj.jus.br/improbidade_adm/visualizar_condenacao.php?seq_condenacao=", 
      currentPage, 
      sep='') 

doc <- htmlParse(link, encoding = "UTF-8") #this will preserve characters 
    tables <- readHTMLTable(doc, stringsAsFactors = FALSE) 
    if(length(tables) != 0) { 
    tabela2 <- as.data.frame(tables[10]) 

    tabela2[,1] <- gsub("\\n", " ", tabela2[,1]) 
    tabela2[,2] <- gsub("\\n", " ", tabela2[,2]) 
    tabela2[,2] <- gsub("\\t", " ", tabela2[,2]) 

    listofTabelas[[i]] <- tabela2 

    tabela1 <- do.call("rbind", listofTabelas) 
    names(tabela1) <- c("Variaveis", "status") 

    } 
} 

답변

8

당신은 httr 패키지를 사용하여 더 나을 수 있습니다

다음은 재현 예이다. 문서에서

library(httr) 
library(XML) 

url <- "http://www.cnj.jus.br/improbidade_adm/visualizar_condenacao.php" 
for (i in 575:585){ 
    response<- GET(url,path="/",query=c(seq_condenacao=as.character(i))) 
    if (response$status_code!=200){ # HTTP request failed!! 
    # do some stuff... 
    print(paste("Failure:",i,"Status:",response$status_code)) 
    next 
    } 
    doc <- htmlParse(response, encoding = "UTF-8") 
    # do some other stuff 
    print(paste("Success:",i,"Status:",response$status_code)) 
} 
# [1] "Success: 575 Status: 200" 
# [1] "Success: 576 Status: 200" 
# [1] "Success: 577 Status: 200" 
# [1] "Success: 578 Status: 200" 
# [1] "Success: 579 Status: 200" 
# [1] "Success: 580 Status: 200" 
# [1] "Success: 581 Status: 200" 
# [1] "Success: 582 Status: 200" 
# [1] "Success: 583 Status: 200" 
# [1] "Success: 584 Status: 200" 
# [1] "Success: 585 Status: 200" 
+0

- htmlParse (콘텐츠 (z), 인코딩 = "UTF-8") –

+0

죄송 그것이 있어야 htmlParse '(대응 ...)'. 답변이 수정되었습니다. – jlhoward