2017-08-17 4 views
0

Je suis en train de gratter une table.R Scraping - ignorer l'erreur HTML 500 en boucle

dput(head(temp_data)) 
structure(list(link = c("http://ujp.gov.mk/mk/prebaruvanje_pravni_lica/prikazi?edb=MK4030998342636", 
"http://ujp.gov.mk/mk/prebaruvanje_pravni_lica/prikazi?edb=MK4030998342636", 
"http://ujp.gov.mk/mk/prebaruvanje_pravni_lica/prikazi?edb=MK4030998378860", 
"http://ujp.gov.mk/mk/prebaruvanje_pravni_lica/prikazi?edb=MK4030998346429", 
"http://ujp.gov.mk/mk/prebaruvanje_pravni_lica/prikazi?edb=MK4030998346429", 
"http://ujp.gov.mk/mk/prebaruvanje_pravni_lica/prikazi?edb=MK4030998346429" 
)), .Names = "link", row.names = c(NA, 6L), class = "data.frame") 

Mon code:

new_function <- function() { 


for (i in 1:nrow(temp_data)) { 

    temp_data_point <- temp_data[i, ] 
    file <- read_html(temp_data_point) 
    tables <- html_nodes(file, "table") 
    table1 <- html_table(tables[8], fill = TRUE) 
    table2 <- as.data.frame(table1) 
    table2 <- table2[15:24 , 1:2] 


    colnames(table2)[1] <- "variables" 
    colnames(table2)[2] <- "results" 


    table2[1, 1] <- "name" 
    table2[2, 1] <- "legal_form" 
    table2[3, 1] <- "industry" 
    table2[4, 1] <- "tax_num" 
    table2[5, 1] <- "id" 
    table2[6, 1] <- "account_num" 
    table2[7, 1] <- "bank_name" 
    table2[8, 1] <- "address" 
    table2[9, 1] <- "location" 
    table2[10, 1] <- "phone" 

    test2 <- spread(table2, variables, results) 
    temp_table3[i, ] <- test2 

} 

return(temp_table3) 

} 

Le problème se pose lorsque l'un ne contient pas de table de l'URL. Par exemple:

Avec le lien non-travail je reçois:

Erreur dans open.connection (x, « rb "): Erreur HTML 500

Des idées comment je peux implémenter une instruction if, qui vérifie si le lien contient la table, et sinon, passez à la prochaine itération? Peut-être un TryCatch?

Répondre

2

Disons que vous avez un lien de table vide. Commencez par vérifier le code d'état de la demande.

library(httr) 
r = GET("http://www.ujp.gov.mk/mk/prebaruvanje_pravni_lica/prikazi?edb=MK4019999105375") 
status = status_code(r) 

Ensuite, utilisez l'instruction conditionnelle. Si le code d'état n'est pas égal à 500 aller de l'avant et analyser la table. Sinon, passez à l'itération suivante.

if(status != 500){ 
    # parse table 
} 
else{ 
    next # jump to next iteration 
}