【问题标题】:Using urltools::url_parse with UTF-8 domains将 urltools::url_parse 与 UTF-8 域一起使用
【发布时间】:2019-07-16 15:17:36
【问题描述】:

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?我尝试了iconvstringi 包中的一些功能,但没有成功。

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

编辑:不幸的是,url1 &lt;- 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=German_Germany.1252 LC_CTYPE=German_Germany.1252
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
[5] LC_TIME=German_Germany.1252

附加的基础包: [1] stats graphics grDevices utils datasets methods base

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

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

【问题讨论】:

  • 我没有得到你在url &lt;- "www.cordes-tiefkühlprodukte.de";urltools::url_parse(url) 时显示的特殊字符。 domain 列显示为 www.cordes-tiefkühlprodukte.de,与 url 相同。我的 R 版本是 R version 3.5.2packageVersion("urltools") ‘1.7.3’。您可能想用您的 sessionInfo() 更新帖子
  • 可能是我的 LOCALE 有问题?
  • 我也得到了特殊字符。这是否解决了您的问题:URLencode(enc2utf8(url))?

标签: r url-parsing


【解决方案1】:

我可以重现该问题。我可以使用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% 确定。

【讨论】:

    【解决方案2】:

    仅供参考,另一种适合我的方法是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2015-04-28
      • 2023-04-10
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多