r-在UTF-8域中使用urltools::url_parse



函数url_parse速度非常快,大部分时间都能正常工作。但最近,域名可能包含UTF-8字符,例如

url <- "www.cordes-tiefkühlprodukte.de"

现在,如果我在这个url上应用url_parse,我会在域列中得到一个特殊字符"<fc>":

url_parse(url)
scheme                            domain port path parameter fragment
1   <NA> www.cordes-tiefk<fc>hlprodukte.de <NA> <NA>      <NA>     <NA>

我的问题是:如何将此条目"修复"为UTF-8?我尝试了iconvstringi包中的一些函数,但没有成功。

(我知道httr::parse_url,它没有这个问题。因此,一种方法是检测非ascii的URL,并在这些URL上使用url_parse,在少数特殊情况下使用parse_url。然而,这导致了(有效)检测非asci URL的问题。)

编辑:不幸的是,url1 <- URLencode(enc2utf8(url))没有帮助。当我做时

robotstxt::paths_allowed(
url1, 
domain=urltools::suffix_extract(urltools::domain(url1))
)

我得到一个错误could not resolve host。然而,手动插入原始URL和二级域,paths_allowed可以工作。

> sessionInfo()

R版本3.6.1(2019-07-05)平台:x86_64-w64-mingw32/x64(64位)运行环境:Windows 10 x64(内部版本17134)

矩阵产品:默认

区域设置:[1] LC_COLLATE=德国.1252 LC_CTYPE=德国.1252
[3]LC_MONETARY=德国.1252LC_NUMERIC=C
[5]LC_TIME=德国.1252-

附加的基本包:[1] 统计图形grDevices实用程序数据集方法基础

其他附加包裹:[1] urltools_1.73 fortunes_1.5-4

通过命名空间加载(未附加):[1] compiler_3.6.1 Rpp_1.0.1 triebeard_0.3.0

我可以重现这个问题。我可以通过使用readr::parse_characterlatin1编码将列domain转换为UTF-8:

library(urltools)
library(tidyverse)
url <- "www.cordes-tiefkühlprodukte.de"
parts <- 
url_parse(url) %>% 
mutate(domain = parse_character(domain, locale = locale(encoding = "latin1")))
parts
scheme                         domain port path parameter fragment
1   <NA> www.cordes-tiefkühlprodukte.de <NA> <NA>      <NA>     <NA>

我想你必须指定的编码(这里是latin1)只取决于你的语言环境,而不是url的特殊字符,但我不能100%确定。

仅供参考,另一种对我来说很好的方法是:

library(stringi)
url <- "www.cordes-tiefkühlprodukte.de"
url <- stri_escape_unicode(url)
dat <- urltools::parse_url(url)
for(cn in colnames(dat)) dat[,cn] <- stri_unescape_unicode(dat[,cn])

相关内容

  • 没有找到相关文章

最新更新