将 urltools::url_parse 与 UTF-8 域一起使用
Using urltools::url_parse with UTF-8 domains
函数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>
我的问题是:我怎样才能"fix"这个条目到UTF-8?我尝试了 iconv
和 stringi
包中的一些函数,但没有成功。
(我知道 httr::parse_url
没有这个问题。所以一种方法是检测不是 ascii 的 url,然后使用 url_parse
那些和 parse_url
在少数特殊情况下。但是,这会导致(有效地)检测非 ascii URLs 的问题。)
编辑:不幸的是,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=German_Germany.1252 LC_CTYPE=German_Germany.1252
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
[5] LC_TIME=German_Germany.1252
附加基础包:
[1] 统计图形 grDevices 实用程序数据集方法基础
其他附包:
[1] urltools_1.7.3 fortunes_1.5-4
通过名称空间加载(未附加):
[1] compiler_3.6.1 Rcpp_1.0.1 triebeard_0.3.0
我可以重现这个问题。我可以通过使用 readr::parse_character
和 latin1
编码读取它,将列 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])
函数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>
我的问题是:我怎样才能"fix"这个条目到UTF-8?我尝试了 iconv
和 stringi
包中的一些函数,但没有成功。
(我知道 httr::parse_url
没有这个问题。所以一种方法是检测不是 ascii 的 url,然后使用 url_parse
那些和 parse_url
在少数特殊情况下。但是,这会导致(有效地)检测非 ascii URLs 的问题。)
编辑:不幸的是,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=German_Germany.1252 LC_CTYPE=German_Germany.1252
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
[5] LC_TIME=German_Germany.1252
附加基础包: [1] 统计图形 grDevices 实用程序数据集方法基础
其他附包: [1] urltools_1.7.3 fortunes_1.5-4
通过名称空间加载(未附加): [1] compiler_3.6.1 Rcpp_1.0.1 triebeard_0.3.0
我可以重现这个问题。我可以通过使用 readr::parse_character
和 latin1
编码读取它,将列 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])