2010-03-23 12 views

Odpowiedz

16

Poniżej jest szybkie i zabrudzony rozwiązanie, ale powinno to zadanie:

library(RCurl) 

decode.short.url <- function(u) { 
    x <- try(getURL(u, header = TRUE, nobody = TRUE, followlocation = FALSE)) 
    if(class(x) == 'try-error') { 
    return(u) 
    } else { 
    x <- strsplit(x, "Location: ")[[1]][2] 
    return(strsplit(x, "\r")[[1]][1]) 
    } 
} 

Zmienna 'u' poniżej zawiera jeden adres URL shortend i jeden regularny URL.

u <- c("http://tinyurl.com/adcd", "http://www.google.com") 

Następnie można uzyskać rozszerzone wyniki, wykonując następujące czynności.

sapply(u, decode.short.url) 

Powyższe powinno działać w przypadku większości usług, które skracają adres URL, a nie tylko tinyURL. Myślę.

HTH

Tony Breyal

1

Nie znam R, ale generalnie musisz wykonać zapytanie http do maleurl-url. Powinieneś otrzymać odpowiedź 301 z faktycznym adresem URL.

0
library(RCurl) 

decode.short.url <- function(u) { 
    x <- try(getURL(u, header = TRUE, nobody = TRUE, followlocation = FALSE)) 
    if(class(x) == 'try-error') { 
    return(u) 
    } else { 
    x <- strsplit(x, "Location: ")[[1]][2] 
    return(strsplit(x, "\r")[[1]][1]) 
    } 
} 


(u <- c("http://tinyurl.com/adcd", "http://tinyurl.com/fnqsh")) 
(sapply(u, decode.short.url)) 
+0

Tony, masz dwa konta? –

+0

@ JD-Long Tak, ale nie wiem jak połączyć oba konta. Ten na górze używa OpenID. Nie pamiętam nawet, jak zalogować się do tego na dole (z rysunkiem Danger Mouse). Jestem nowy w publikowaniu na stackoverflow. –

1

użyłem kodu Tony Breyal, ale funkcja powrócił NA wartości dla tych adresów URL, gdzie nie było URL przekierowania. Mimo że Tony umieścił w swoim przykładzie "google.com", uważam, że Google przekierowuje cię w każdym przypadku do jakiejś zlokalizowanej wersji google.com.

Oto jak zmodyfikowany kod Tony'ego sobie z tym poradzić:

decode.short.url <- function(u) { 
    x <- try(getURL(u, header = TRUE, nobody = TRUE, followlocation = FALSE)) 
    if(class(x) == 'try-error') { 
    print(paste("***", u, "--> ERORR!!!!"))  
    return(u) 
    } else { 
    x <- strsplit(x, "Location: ")[[1]][2] 
    x.2 <- strsplit(x, "\r")[[1]][1] 
    if (is.na(x.2)){ 
     print(paste("***", u, "--> No change.")) 
     return(u) 
    }else{ 
     print(paste("***", x.2, "--> resolved in -->", x.2)) 
     return(x.2) 
    } 
    } 
} 


u <- list("http://www.amazon.com", "http://tinyurl.com/adcd") 
urls <- sapply(u, decode.short.url) 
Powiązane problemy