解析して正規化したい URL のリストがあります。
「www.google.com/test/index.asp」と「google.com/somethingelse」が同じ Web サイトからのものであることを識別できるように、各アドレスを部分に分割できるようにしたいと考えています。
とにかく正規表現を使用するので、甘くて凝った呼び出し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)
ホスト名の正規表現を変更して、ポートを含める (キャプチャしない):
HOSTNAME_REGEX <- "([^:/]+)(?::[0-9]+)?"
などなど、最終的にURL を解析するための RFC 準拠の正規表現に到達するまで。ただし、家庭で使用する場合は、上記で十分です。
> 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"
Rパッケージhttrの機能を利用できます
parse_url(url)
>parse_url("http://google.com/")
ここで詳細を取得できます: http://cran.r-project.org/web/packages/httr/httr.pdf
パッケージを忘れて、これには正規表現を使用します。
Dason からのロボットの攻撃の後、EDITが再作成されました...
x <- c("talkstats.com", "www.google.com/test/index.asp",
"google.com/somethingelse", "www.stackoverflow.com",
"http://www.bing.com/search?q=google.com&go=&qs=n&form=QBLH&pq=google.com&sc=8-1??0&sp=-1&sk=")
parser <- function(x) gsub("www\\.", "", sapply(strsplit(gsub("http://", "", x), "/"), "[[", 1))
parser(x)
lst <- lapply(unique(parser(x)), function(var) x[parser(x) %in% var])
names(lst) <- unique(parser(x))
lst
## $talkstats.com
## [1] "talkstats.com"
##
## $google.com
## [1] "www.google.com/test/index.asp" "google.com/somethingelse"
##
## $stackoverflow.com
## [1] "www.stackoverflow.com"
##
## $bing.com
## [1] "http://www.bing.com/search?q=google.com&go=&qs=n&form=QBLH&pq=google.com&sc=8-1??0&sp=-1&sk="
これは、データの構造に応じて拡張する必要がある場合があります。
R_Newbie の回答に基づいて、(ベクトルの) URL からサーバー名を抽出し、www.
存在する場合はプレフィックスを取り除き、欠落しているプロトコル プレフィックスを適切に無視する関数を次に示します。
domain.name <- function(urls) {
require(httr)
require(plyr)
paths <- laply(urls, function(u) with(parse_url(u),
paste0(hostname, "/", path)))
gsub("^/?(?:www\\.)?([^/]+).*$", "\\1", paths)
}
このparse_url
関数はpath
、 によってさらに処理される引数を抽出するために使用されgsub
ます。正規表現の/?
and(?:www\\.)?
の部分は、オプションの先頭のスラッシュとそれに続くオプションwww.
の に一致し、 the は[^/]+
それ以降で最初のスラッシュの前のすべてに一致します。これはキャプチャされ、gsub
呼び出しの置換テキストで効果的に使用されます。
> 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"
tldextract が好きな場合、1 つのオプションは appengine でバージョンを使用することです
require(RJSONIO)
test <- c("test.server.com/test", "www.google.com/test/index.asp", "http://test.com/?ex")
lapply(paste0("http://tldextract.appspot.com/api/extract?url=", test), fromJSON)
[[1]]
domain subdomain tld
"server" "test" "com"
[[2]]
domain subdomain tld
"google" "www" "com"
[[3]]
domain subdomain tld
"test" "" "com"