使用R从网页中提取链接

时间:2010-09-19 15:22:21

标签: r web-scraping

以下两个帖子是从网站提取数据并将其解析为R的不同方法的很好的例子。

Scraping html tables into R data frames using the XML package

How can I use R (Rcurl/XML packages ?!) to scrape this webpage

我对编程很陌生,刚开始使用R,所以我希望这个问题非常基本,但鉴于上面的帖子,我想是的。

我要做的就是提取与给定模式匹配的链接。我觉得我可以使用RCurl来读取网页并使用字符串表达式提取它们的暴力方法。也就是说,如果网页形成得相当好,我将如何使用XML包进行此操作。

随着我了解更多,我喜欢在查看问题时“查看”数据。问题是这些方法中的一些会生成列表列表等列表,因此新人(像我一样)很难走到我需要去的地方。

同样,我对所有编程都很陌生,所以任何帮助或代码片段都将不胜感激。

3 个答案:

答案 0 :(得分:31)

htmlTreeParse的文档显示了一种方法。这是另一个:

> 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”属性。)

我之前的回复:

一种方法是使用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中每个输入字符串一个 - 因为这里有一个长度,匹配只有一个元素。第一个捕获组的匹配位于此矩阵的第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] "/"

答案 1 :(得分:27)

使用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"

答案 2 :(得分:0)

您可以尝试

htmlcode = read_html("URL")
nodes=html_nodes(htmlcode,xpath='//*[contains(@href, "SEARCHTERM")]') %>% html_attr("href")
df=as.data.frame(as.character(nodes))
names(df)="link"