2010-03-23 26 views

Trả lời

16

Dưới đây là một giải pháp nhanh chóng và dơ bẩn, nhưng nên hoàn thành công việc:

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]) 
    } 
} 

Biến 'u' bên dưới chứa một url rút ngắn đáng, và một url thường xuyên.

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

Sau đó, bạn có thể nhận được kết quả mở rộng bằng cách làm như sau.

sapply(u, decode.short.url) 

Điều trên sẽ phù hợp với hầu hết các dịch vụ rút ngắn URL, không chỉ tinyURL. Tôi nghĩ.

HTH

Tony Breyal

1

Tôi không biết R nhưng nói chung, bạn cần thực hiện yêu cầu http đến url tinyurl. Bạn sẽ nhận được phản hồi 301 với url thực.

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, bạn có hai tài khoản? –

+0

@ JD-Long Có, nhưng tôi không biết cách kết hợp hai tài khoản. Một ở đầu sử dụng OpenID. Tôi thậm chí không thể nhớ làm thế nào để đăng nhập vào một ở phía dưới (với ảnh chuột nguy hiểm). Tôi mới đăng bài trên stackoverflow. –

1

tôi đã sử dụng mã Tony Breyal, nhưng chức năng trở NA giá trị đối với những URL mà không có sự chuyển hướng URL. Mặc dù Tony đã liệt kê "google.com" trong ví dụ của mình, tôi nghĩ rằng Google chuyển hướng bạn trong bất kỳ trường hợp nào đối với một số loại phiên bản địa phương của google.com.

Dưới đây là cách tôi sửa đổi mã của Tony để đối phó với điều đó:

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) 
Các vấn đề liên quan