提问者:小点点

使用urltools::UTF-8域的url_parse


函数url_parse非常快,大多数时候都可以正常工作。但是最近,域名可能包含UTF-8个字符,例如

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

现在如果我在这个url上应用url_parse,我得到一个特殊的字符"

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

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

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

编辑:不幸的是,url1

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

我得到一个错误无法解析主机。但是,手动插入原始URL和二级域,paths_allowed可以工作。

> sessionInfo()

R版本3.6.1(2019-07-05)平台:x86_64-w64-mingw32/x64(64-bit)运行于:Windows 10 x64(build 17134)

矩阵产品:默认

LC_COLLATE=German_Germany.1252LC_CTYPE=German_Germany.1252
[3]LC_MONETARY=German_Germany.1252LC_NUMERIC=C
[5]LC_TIME=German_Germany.1252

附加的基础包:[1]stats图形grDevices utils数据集方法基础

其他附包:[1]urltools_1.7.3fortunes_1.5-4

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


共2个答案

匿名用户

我可以重现这个问题。我可以将列domain转换为UTF-8,方法是使用readr::latin1编码读取它:

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