从多个 rvest 元素构建数据框
Build data frame from multiple rvest elements
我正在尝试对期刊文章元数据(标题、作者、摘要等)进行一些网络抓取。我有一个我需要导航的页面列表,每个页面都有我需要的信息(我的列表中的 table 内容页面除外)。我构建了一个函数来将页面的每个部分拼凑成一个列表,我试图遍历每个页面并最终得到我的结果的数据框。
这是我的资料:
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]))
}
如何从列表中的每个页面中抓取元素并将结果合并为数据框?
您可以使用 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)
我正在尝试对期刊文章元数据(标题、作者、摘要等)进行一些网络抓取。我有一个我需要导航的页面列表,每个页面都有我需要的信息(我的列表中的 table 内容页面除外)。我构建了一个函数来将页面的每个部分拼凑成一个列表,我试图遍历每个页面并最终得到我的结果的数据框。
这是我的资料:
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]))
}
如何从列表中的每个页面中抓取元素并将结果合并为数据框?
您可以使用 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)