我有几个问题,通过搜索找不到合理的解决方案。我正在努力从期刊上抓取引文信息,并且在数据框架中编译它们时遇到了一些麻烦。
这段代码很好,但最大的问题是它创建了一个长向量而不是表。这是第一个问题。
第二个问题是,如果我尝试从csv文件加载网页,脚本将无法运行。我会收到以下错误:
UseMethod(“read_xml”)中的错误:没有适用的方法 'read_xml'应用于类“factor”的对象
这只是列出网址的csv。
第三个也是最后一个问题是文章可能包含多个电子邮件,因此不止一行。代码忽略了这一点。例如,论文 http://journals.sagepub.com/doi/full/10.3102/0013189X17737739
library(rvest)
data<- c("http://journals.sagepub.com/doi/abs/10.3102/0013189X037001060",
"http://journals.sagepub.com/doi/abs/10.3102/0013189X037002102",
"http://journals.sagepub.com/doi/abs/10.3102/0013189X037002104",
"http://journals.sagepub.com/doi/full/10.3102/0013189X17737739")
scrape <- function(x){
doc<-read_html(x)
author <- html_text(html_nodes(doc, '.art_authors'))
year <- html_text(html_nodes(doc, '.year'))
journalName <- html_text(html_nodes(doc, '.journalName'))
art_title <- html_text(html_nodes(doc, '.art_title'))
volume <- html_text(html_nodes(doc, '.volume'))
page <- html_text(html_nodes(doc, '.page'))
email <- html_text(html_nodes(doc, xpath = "//a[@class = 'email']"))
Author = ifelse(length(author)==0, NA, author)
Year = ifelse(length(year)==0, NA, year)
Journal_Name = ifelse(length(journalName)==0, NA, journalName)
Art_Title = ifelse(length(art_title)==0, NA, art_title)
Volume = ifelse(length(volume)==0, NA, volume)
Page = ifelse(length(page)==0, NA, page)
Email = ifelse(length(email)==0, NA, email)
row<-cbind(Author, Year, Journal_Name, Art_Title, Volume, Page, Email)
}
y <- lapply (data, scrape)
View (y)
当我尝试从csv
运行脚本时data<- read.csv ("link_test.csv")
y <- lapply (data$link, scrape)
非常感谢任何帮助。
答案 0 :(得分:2)
如果您将此功能称为最后一行,您将得到您想要的内容;)
y <- do.call(rbind, y)
library(DT)
datatable(y)
对于多个电子邮件地址,您应该将该函数的最后一行更改为:
Email = ifelse(length(email)==0, NA,
ifelse(length(email)==1, email, paste(email, collapse=" ; ")))
但我没有测试过,因为我没有找到任何带有多个电子邮件地址的网页。
答案 1 :(得分:1)
对于csv,如果没有看到文件结构,至少有几行就很难回答。但是,问题可能由此解决:
# bind your list items together as rows
df <- do.call(rbind, y)
# ensure each column is class character rather than factors
df <- as.data.frame(df, stringsAsFactors = FALSE)
编辑:更新以回答您的修改。 在一些网页中,有多个作者,网页似乎在一个节点中呈现为逗号分隔的文本字符串。您发布的代码似乎没有返回您的示例网页的任何电子邮件。但是,如果它确实返回了电子邮件的列表或向量,您可以通过粘贴来折叠它们,如下所示:
Email = ifelse(length(email)==0, NA, do.call(paste, email, sep = ", "))