从多个rvest元素构建数据框架

时间:2016-04-19 05:18:28

标签: r dataframe web-scraping rvest

我正在尝试对期刊文章元数据(标题,作者,摘要等)进行一些网络抓取。我有一个页面列表,我需要导航,每个页面都有我需要的信息(除了列表中的目录页面)。我构建了一个功能,将页面的每个部分拼凑成一个列表,我试图遍历每个页面,最后得到我的结果的数据框。

这就是我所拥有的:

article.links <- c("http://onlinelibrary.wiley.com/doi/10.1002/jee.20116/abstract", 
"http://onlinelibrary.wiley.com/doi/10.1002/jee.20120/abstract", 
"http://onlinelibrary.wiley.com/doi/10.1002/jee.20117/abstract"
)

pager <- function(page) {
  new.row = vector("list", 4)
  page <- read_html(page)

  #DOI
  new.row[1] <- page %>%
    html_node("#doi") %>%
    html_text()

  #Title
  new.row[2] <- page %>%
    html_node(".mainTitle") %>%
    html_text()

  #Authors
  new.row[3] <- page %>%
    html_node("#authors") %>%
    html_text()

  #Abstract
  new.row[4] <- page %>%
    html_node("#abstract") %>%
    html_text()

  return(unlist(new.row))
}

当我运行pager.test(article.links.test[1])时,结果就是我期望的1个条目。我不太确定如何使用一系列结果构建数据框。我尝试使用rbind的for循环将行放在一起,但是当我尝试所有行时,它会抛出有关正在生成的条目的错误:

#This is what doesn't seem to work
abstracts <- data.frame()
for(key in 1:length(article.links.test)) {
  abstracts <- rbind(abstracts2, pager.test(article.links.test[key]))
}

如何从列表中的每个页面中抓取元素并将结果合并为数据框?

1 个答案:

答案 0 :(得分:2)

您可以使用lapply然后使用rbind

options(stringsAsFactors=F)
library(rvest)
article.links <- c("http://onlinelibrary.wiley.com/doi/10.1002/jee.20116/abstract",                     
    "http://onlinelibrary.wiley.com/doi/10.1002/jee.20120/abstract", 
    "http://onlinelibrary.wiley.com/doi/10.1002/jee.20117/abstract"
)

pager <- function(page) {
    doc <- read_html(url(page))
    data.frame(DOI=doc %>% html_node("#doi") %>% html_text(),
        Title=doc %>% html_node(".mainTitle") %>% html_text(),
        Authors=doc %>% html_node("#authors") %>% html_text(),
        Abstract=doc %>% html_node("#abstract") %>% html_text())
}

ans <- do.call(rbind, lapply(article.links, pager))
str(ans)