以下两个帖子是从网站提取数据并将其解析为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包进行此操作。
随着我了解更多,我喜欢在查看问题时“查看”数据。问题是这些方法中的一些会生成列表列表等列表,因此新人(像我一样)很难走到我需要去的地方。
同样,我对所有编程都很陌生,所以任何帮助或代码片段都将不胜感激。
答案 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"