R是否有任何用于解析URL部分的包?

Rob*_*lly 13 url parsing r

我有一个网址列表,我想解析和规范化.

我希望能够将每个地址分成几部分,以便我可以将"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)

  • 使用包中的代码的优点是它带有单元测试,您可以提交错误报告,而其他人可能会修复错误. (2认同)

小智 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


hrb*_*str 5

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)