13

解析して正規化したい URL のリストがあります。

「www.google.com/test/index.asp」と「google.com/somethingelse」が同じ Web サイトからのものであることを識別できるように、各アドレスを部分に分割できるようにしたいと考えています。

4

6 に答える 6

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)

ホスト名の正規表現を変更して、ポートを含める (キャプチャしない):

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"       
于 2013-06-25T00:50:58.643 に答える
11

Rパッケージhttrの機能を利用できます

 parse_url(url) 
 >parse_url("http://google.com/")

ここで詳細を取得できます: http://cran.r-project.org/web/packages/httr/httr.pdf

于 2013-06-24T21:43:01.720 に答える
4

パッケージを忘れて、これには正規表現を使用します。

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="

これは、データの構造に応じて拡張する必要がある場合があります。

于 2013-06-24T21:38:08.143 に答える
3

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"       
于 2013-06-24T22:56:36.223 に答える
2

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" 
于 2013-06-25T04:02:05.317 に答える