在线循环播放PDF文件数组并从中复制文本

时间:2018-05-03 20:08:33

标签: r

我发现抓取PDF文件,保存并从文件中获取所有文本非常容易。

library(pdftools)
download.file("http://www2.sas.com/proceedings/sugi30/085-30.pdf", "sample.pdf", mode = "wb")
txt <- pdf_text("sample.pdf")

我想知道如何循环播放一系列PDF文件,基于链接,下载每个文件,并从每个文件中删除测试。我想转到以下链接。

http://www2.sas.com/proceedings/sugi30/toc.html#dp

然后我想将每个文件从'Paper 085-30:'下载到'Paper 095-30:'。最后,我想从每个文件中删除文本。我怎么能这样做?

我认为会是这样的,但我怀疑粘贴功能设置不正确。

library(pdftools)
for(i in values){'085-30',' 086-30','087-30','088-30','089-30'
paste(download.file("http://www2.sas.com/proceedings/sugi30/"i".pdf", i".pdf", mode = "wb")sep = "", collapse = NULL)
}

1 个答案:

答案 0 :(得分:2)

您可以使用rvest获取pdf列表。

library(rvest)

x <- read_html("http://www2.sas.com/proceedings/sugi30/toc.html#dp")
href <- x %>% html_nodes("a") %>% html_attr("href")

 # char vector of links, use regular expression to fetch only papers
links <- href[grepl("^http://www2.sas.com/proceedings/sugi30/\\d{3}.*\\.pdf$", href)]

我添加了一些错误处理,并且不要忘记将R会话置于睡眠状态,这样您就不会充斥服务器。如果下载不成功,链接将存储到一个变量中,您可以在循环完成后调查该变量并调整您的代码或手动下载它们。

# write failed links to this variable
unsuccessful <- c()

for (link in links) {
  out <- tryCatch(download.file(url = link, destfile = basename(link), mode = "wb"), 
                  error = function(e) e, warning = function(w) w)

  if (class(out) %in% c("simpleError", "simpleWarning")) {
    message(sprintf("Unable to download %s ?", link))
    unsuccessful <- c(unsuccessful, link)
  }

  sleep <- abs(rnorm(1, mean = 10, sd = 10))
  message(sprintf("Sleeping for %f seconds", sleep))
  Sys.sleep(sleep) # don't flood the server, sleep for a while 
}