web-dev-qa-db-ja.com

Rを使用してWebページからリンクを抽出する

以下の2つの投稿は、Webサイトからデータを抽出してRに解析するさまざまなアプローチの優れた例です。

XMLパッケージを使用してHTMLテーブルをRデータフレームにスクレイピング

R(Rcurl/XMLパッケージ)を使用して、このWebページをスクレイピングするにはどうすればよいですか

私はプログラミングに非常に慣れていないので、Rから始めたばかりなので、この質問がかなり基本的なものであることを願っていますが、上記の投稿を考えると、そうだと思います。

私が探しているのは、特定のパターンに一致するリンクを抽出することだけです。 RCurlを使用してWebページを読み取り、文字列式を使用してブルートフォースメソッドを抽出できると思います。とは言っても、Webページが適切に形成されている場合、XMLパッケージを使用してどのように作成すればよいでしょうか。

詳細を知るにつれ、問題に取り組むときにデータを「見る」のが好きです。問題は、これらのアプローチの一部がリストのリストのリストなどを生成することです。そのため、新しい人(私のような人)が私が行く必要がある場所を歩くのは難しいです。

繰り返しますが、私はプログラミングのすべてに非常に新しいので、ヘルプやコードスニペットは大歓迎です。

27
Btibert3

htmlTreeParseのドキュメントには、1つの方法が示されています。ここに別のものがあります:

> url <- "http://stackoverflow.com/questions/3746256/extract-links-from-webpage-using-r"
> doc <- htmlParse(url)
> links <- xpathSApply(doc, "//a/@href")
> free(doc)

(「リンク」を「as.vector」に渡すことにより、返されたリンクから「href」属性を削除できます。

私の以前の返事:

1つの方法は、Hadley Wickhamのstringrパッケージを使用することです。これは、install.packages( "stringr"、dep = TRUE)でインストールできます。

> url <- "http://stackoverflow.com/questions/3746256/extract-links-from-webpage-using-r"
> html <- paste(readLines(url), collapse="\n")
> library(stringr)
> matched <- str_match_all(html, "<a href=\"(.*?)\"")

(私は、正規表現の使用をここで承認しない人もいると思います。)

matchedはマトリックスのリストで、ベクターhtmlの入力文字列ごとに1つです。ここでは長さが1であるため、matchedには1つの要素しかありません。最初のキャプチャグループの一致は、このマトリックスの列2にあります(通常、i番目のグループは列(i + 1)に表示されます)。

> links <- matched[[1]][, 2]
> head(links)
[1] "/users/login?returnurl=%2fquestions%2f3746256%2fextract-links-from-webpage-using-r"
[2] "http://careers.stackoverflow.com"                                                  
[3] "http://meta.stackoverflow.com"                                                     
[4] "/about"                                                                            
[5] "/faq"                                                                              
[6] "/"
32
David F

rvestでさらに簡単:

library(xml2)
library(rvest)

URL <- "http://stackoverflow.com/questions/3746256/extract-links-from-webpage-using-r"

pg <- read_html(URL)

head(html_attr(html_nodes(pg, "a"), "href"))

## [1] "//stackoverflow.com"                                                                                                                                          
## [2] "http://chat.stackoverflow.com"                                                                                                                                
## [3] "//stackoverflow.com"                                                                                                                                          
## [4] "http://meta.stackoverflow.com"                                                                                                                                
## [5] "//careers.stackoverflow.com?utm_source=stackoverflow.com&utm_medium=site-ui&utm_campaign=multicollider"                                                       
## [6] "https://stackoverflow.com/users/signup?ssrc=site_switcher&returnurl=http%3a%2f%2fstackoverflow.com%2fquestions%2f3746256%2fextract-links-from-webpage-using-r"
31
hrbrmstr