rvest中webscraping循环的问题

时间:2018-05-24 13:56:13

标签: r

我有几个问题,通过搜索找不到合理的解决方案。我正在努力从期刊上抓取引文信息,并且在数据框架中编译它们时遇到了一些麻烦。

这段代码很好,但最大的问题是它创建了一个长向量而不是表。这是第一个问题。

第二个问题是,如果我尝试从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)

非常感谢任何帮助。

2 个答案:

答案 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 = ", "))