2017-08-17 1 views
0

Ich kratze einen Tisch.R Scraping - überspringen HTML-Fehler 500 in Schleife

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") 

Mein 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) 

} 

Das Problem tritt auf, wenn eine der URL keine Tabelle enthalten. Zum Beispiel:

Mit dem nicht funktionierenden Link erhalte ich:

Fehler in open.connection (x, „rb "): HTML - Fehler 500

Irgendwelche Ideen, wie ich eine if - Anweisung implementieren kann, die überprüft, ob der Link die Tabelle enthält, und wenn nicht, springen Sie zum nächste Iteration? Vielleicht ein TryCatch?

Antwort

2

Nehmen wir an, Sie haben einen leeren Tabellenlink. Überprüfen Sie zuerst den Anforderungsstatuscode.

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

Verwenden Sie dann bedingte Anweisung. Wenn der Statuscode ungleich 500 ist, fahren Sie fort und analysieren Sie die Tabelle. Sonst springe zur nächsten Iteration.

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