【问题标题】:Build data frame from multiple rvest elements从多个 rvest 元素构建数据框
【发布时间】:2016-08-11 02:07:26
【问题描述】:

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

这是我所拥有的:

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]))
}

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

【问题讨论】:

    标签: r dataframe web-scraping rvest


    【解决方案1】:

    您可以使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多