我有一个网址列表,我想解析和规范化.
我希望能够将每个地址分成几部分,以便我可以将"www.google.com/test/index.asp"和"google.com/somethingelse"标识为来自同一网站.
krl*_*mlr 12
因为parse_url()无论如何都使用正则表达式,我们也可以重新发明轮子并创建一个正则表达式替换,以便建立一个甜蜜和奇特的gsub调用.
让我们来看看.URL由一个协议组成,一个"netloc",可能包括用户名,密码,主机名和端口组件,以及我们愉快地剥离的余数.我们首先假设没有用户名,密码和端口.
^(?:(?:[[:alpha:]+.-]+)://)?将匹配协议标题(从中复制parse_url()),如果我们找到它,我们将剥离它www.前缀被剥离,但未被捕获:(?:www\\.)?([^/]+).*$现在我们将上面的正则表达式拼接在一起,并且主机名的提取变为:
PROTOCOL_REGEX <- "^(?:(?:[[:alpha:]+.-]+)://)?"
PREFIX_REGEX <- "(?:www\\.)?"
HOSTNAME_REGEX <- "([^/]+)"
REST_REGEX <- ".*$"
URL_REGEX <- paste0(PROTOCOL_REGEX, PREFIX_REGEX, HOSTNAME_REGEX, REST_REGEX)
domain.name <- function(urls) gsub(URL_REGEX, "\\1", urls)
Run Code Online (Sandbox Code Playgroud)
更改主机名正则表达式以包括(但不捕获)端口:
HOSTNAME_REGEX <- "([^:/]+)(?::[0-9]+)?"
Run Code Online (Sandbox Code Playgroud)
依此类推,直到我们最终得到一个符合RFC的正则表达式来解析URL.但是,对于家庭使用,上述应该足够:
> domain.name(c("test.server.com/test", "www.google.com/test/index.asp",
"http://test.com/?ex"))
[1] "test.server.com" "google.com" "test.com"
Run Code Online (Sandbox Code Playgroud)
小智 11
您可以使用R包httr的功能
parse_url(url)
>parse_url("http://google.com/")
Run Code Online (Sandbox Code Playgroud)
您可以在此处获取更多详细信息:http: //cran.r-project.org/web/packages/httr/httr.pdf
urltools现在还有一个无限快的包:
urltools::url_parse(c("www.google.com/test/index.asp",
"google.com/somethingelse"))
## scheme domain port path parameter fragment
## 1 www.google.com test/index.asp
## 2 google.com somethingelse
Run Code Online (Sandbox Code Playgroud)