在R中避免url编码

在R中避免url编码,r,url,encoding,rcurl,httr,R,Url,Encoding,Rcurl,Httr,我试图从谷歌地理编码API获取lat/lon,但当地址中有丹麦本地字符时,请求失败。我怀疑这是因为httr::GET函数对url进行了编码,但我不确定我是否正确 如果将此链接直接复制/粘贴到浏览器中,则会得到有效结果: =Søholmen+9、+4500+丹麦 但是下面的代码是无效的,即使url在解析到GET函数之前是相同的。如果我使用一个没有本地字符的地址,它就会工作 library(httr) library(jsonlite) library(stringr) address <-

我试图从谷歌地理编码API获取lat/lon,但当地址中有丹麦本地字符时,请求失败。我怀疑这是因为httr::GET函数对url进行了编码,但我不确定我是否正确

如果将此链接直接复制/粘贴到浏览器中,则会得到有效结果: =Søholmen+9、+4500+丹麦

但是下面的代码是无效的,即使url在解析到GET函数之前是相同的。如果我使用一个没有本地字符的地址,它就会工作

library(httr)
library(jsonlite)
library(stringr)

address <- "Søholmen 9, 4500 Denmark"
# address <- "Kronprinsesse Sofies Vej 6, 2000 Denmark"

base_url <- "http://maps.googleapis.com/maps/api/geocode/json?"

# An address OR components
geo_url <- paste0(base_url, "address=", str_replace_all(address, pattern = " ", replacement = "+"))

# Get the result
# get the content
# Parse the JSON
temp_geo_results <- httr::GET(url = URLencode(URL = geo_url), verbose())
temp_geo_results <- httr::content(temp_geo_results, as = "text")
temp_geo_results <- jsonlite::fromJSON(temp_geo_results)

编辑:我删除了一行问题不需要的代码,并添加了我的sessionInfo。

我可以分享我用我的语言解决同样问题的粗略方法:

deencode <- function(text){
  output <- NULL
  for(i in 1:length(text)){
    temp <- text[i]
    temp <- gsub("ā", "a", temp)  
    temp <- gsub("Ā", "A", temp)
    temp <- gsub("č", "c", temp)
    temp <- gsub("Č", "C", temp)
    temp <- gsub("ē", "e", temp)
    temp <- gsub("Ē", "E", temp)
    temp <- gsub("ģ", "g", temp)
    temp <- gsub("Ģ", "G", temp)
    temp <- gsub("ī", "i", temp)
    temp <- gsub("Ī", "I", temp)
    temp <- gsub("ķ", "k", temp)
    temp <- gsub("Ķ", "K", temp)
    temp <- gsub("ļ", "l", temp)
    temp <- gsub("Ļ", "L", temp)
    temp <- gsub("ņ", "n", temp)
    temp <- gsub("Ņ", "N", temp)
    temp <- gsub("š", "s", temp)
    temp <- gsub("Š", "S", temp)
    temp <- gsub("ū", "u", temp)
    temp <- gsub("Ū", "u", temp)
    temp <- gsub("ž", "z", temp)
    temp <- gsub("Ž", "Z", temp)
    output <- c(output, temp)
  }
  return(output)
}

deencode这似乎是一个编码问题

以下对我来说很好:

address <- "Søholmen 9, 4500 Denmark"
u <- sprintf("http://maps.googleapis.com/maps/api/geocode/json?address=%s", 
             gsub('\\s+', '+', enc2utf8(address)))

fromJSON(content(GET(u), as='text'))

地址您可以使用rvest软件包

library(rvest); library(jsonlite)
address <- "Søholmen 9, 4500 Denmark"
# address <- "Kronprinsesse Sofies Vej 6, 2000 Denmark"
base_url <- "http://maps.googleapis.com/maps/api/geocode/json?"

# An address OR components
geo_url <- paste0(base_url, "address=", str_replace_all(address, pattern = " ", replacement = "+"))
geo_url <- iconv(geo_url, to="UTF-8")

temp_geo_results <- html_text(html_nodes(html(geo_url) , "p"))
temp_geo_results <- fromJSON(temp_geo_results)
library(rvest);图书馆(jsonlite)

地址我是如何解决类似问题的:在
rawToChar
fromJSON
之间设置
Encoding
,如下所示(不可执行)

库(httr)
图书馆(jsonlite)

call_api可能另一个选项是使用另一个编码选项,并使用httr包中的函数build_url/parse_url来构建url,但我不确定如何做到这一点。此url也给出了正确的响应:
http://maps.googleapis.com/maps/api/geocode/json?address=S%C3%B8holmen+9,+4500+丹麦
所以你可能想手工编码,就像@KERO建议的那样,然后它就可以工作了。@LauriK如果我将你的url复制/粘贴到我的浏览器和GET函数中,我会得到一个“错误请求”/“零结果”。奇怪。它在Chrome中对我有效。这些编码问题不时让我感到困惑。。我得仔细阅读一下。我也使用chrome,甚至将我的R文档保存为UTF-8。
gsub
是矢量化的,所以你不需要在
text
:)的元素上循环。我尝试用enc2utf8包装地址,这可以实现。我认为通过将R文件保存为UTF-8可以避免这些问题。显然不是。谢谢你的帮助。非常感谢!好的方面-
enc2utf8
在这里可能更合理。我来编辑。
library(rvest); library(jsonlite)
address <- "Søholmen 9, 4500 Denmark"
# address <- "Kronprinsesse Sofies Vej 6, 2000 Denmark"
base_url <- "http://maps.googleapis.com/maps/api/geocode/json?"

# An address OR components
geo_url <- paste0(base_url, "address=", str_replace_all(address, pattern = " ", replacement = "+"))
geo_url <- iconv(geo_url, to="UTF-8")

temp_geo_results <- html_text(html_nodes(html(geo_url) , "p"))
temp_geo_results <- fromJSON(temp_geo_results)