4

给定网站地址,例如

http://www.example.com/page1/#
https://subdomain.example2.co.uk/asdf?retrieve=2

如何返回根域R,例如

example.com
example2.co.uk

出于我的目的,我将根域定义为具有结构

example_name.public_suffix

其中 example_name 不包括“www”,而 public_suffix 在此处的列表中:

https://publicsuffix.org/list/effective_tld_names.dat

这仍然是基于正则表达式的最佳解决方案吗:

https://stackoverflow.com/a/8498629/2109289

R根据公共后缀列表解析根域的内容怎么样,例如:

http://simonecarletti.com/code/publicsuffix/

已编辑:根据理查德的评论添加额外信息

使用XML::parseURI似乎返回第一个“//”和“/”之间的东西。例如

> parseURI("http://www.blog.omegahat.org:8080/RCurl/index.html")$server
[1] "www.blog.omegahat.org"

因此,问题归结为拥有一个R可以从 URI 返回公共后缀的函数,或者在公共后缀列表上实现以下算法:

算法
  • 根据所有规则匹配域并记下匹配的规则。
  • 如果没有规则匹配,则优先规则为“*”。
  • 如果多个规则匹配,则主要规则是例外规则。
  • 如果没有匹配的异常规则,则优先规则是标签最多的规则。
  • 如果现行规则是例外规则,则通过删除最左边的标签来修改它。
  • 公共后缀是来自域的一组标签,这些标签直接匹配现行规则的标签(由点连接)。
  • 已注册或可注册的是公共后缀加上一个附加标签。
4

2 回答 2

7

这里有两个任务。首先是解析 URL 来获取主机名,这可以通过httr包的parse_url函数来完成:

host <- parse_url("https://subdomain.example2.co.uk/asdf?retrieve=2")$hostname
host
# [1] "subdomain.example2.co.uk"

第二个是提取组织域(或根域,顶级私有域——不管你想怎么称呼它)。这可以使用tldextract包(其灵感来自同名的 Python 包并使用 Mozilla 的公共后缀列表)来完成:

domain.info <- tldextract(host)
domain.info
#                       host subdomain   domain   tld
# 1 subdomain.example2.co.uk subdomain example2 co.uk

tldextract返回一个数据框,每个域都有一行,但您可以轻松地将相关部分粘贴在一起:

paste(domain.info$domain, domain.info$tld, sep=".")
# [1] "example2.co.uk"
于 2014-10-10T03:44:32.630 回答
1

像这样的东西应该有帮助

> strsplit(gsub("http://|https://|www\\.", "", "http://www.example.com/page1/#"), "/")[[c(1, 1)]]
[1] "example.com"

> strsplit(gsub("http://|https://|www\\.", "", "https://subdomain.example2.co.uk/asdf?retrieve=2"), "/")[[c(1, 1)]]
[1] "subdomain.example2.co.uk"
于 2014-10-10T02:39:32.807 回答