【问题标题】:Skipping error files when downloading using download.file in R使用 R 中的 download.file 下载时跳过错误文件
【发布时间】:2018-05-31 12:54:28
【问题描述】:

我有大量指向我想在 for 循环中使用 download.file 下载的 pdf 文件的链接。我的解决方案工作正常,但遇到错误时会停止(许多文件不起作用)。我想在我的 download.file 函数中添加一个功能,告诉 R 在下载产生错误时跳过文件,并打印一条消息,其中包含遇到错误的页面名称。

我发现在这种情况下 tryCatch 可能是一个很好的解决方案,但我不完全确定将它放在哪里(我尝试了多种方法,但都没有奏效)。

这是我的代码:

for (i in length(files) {

# Reads the html links 
  html <- read_html(files[i])
  reads_name <- html_nodes(html, 'h1') 
  name <- trimws(html_text(reads_name) )

# Extracts the pdf. link from all links that the webpage contains 
  webpagelinks <- html_attr(html_nodes(html, "a"), "href")
  extract_pdf_link <- webpagelinks[grepl("\\pdf", webpagelinks)]

# downloads the pdf file from the pdf link, here is where I get the error 
  download.file(extract_pdf_link, destfile = paste0(name, "_paper.pdf") , 
mode = "wb")

  skip_with_message = simpleError('Did not work out')
  tryCatch(print(name), error = function(e) skip_with_message)

  }

关于如何解决这个问题的任何建议?

非常感谢!

【问题讨论】:

    标签: r web-scraping download


    【解决方案1】:

    download.file 放入tryCatch。例如

    files <- c("http://foo.com/bar.pdf", "http://www.orimi.com/pdf-test.pdf", "http://bar.com/foo.pdf")
    oldw <- getOption("warn")
    options(warn = -1)
    for (file in files) {
        tryCatch(download.file(file, tempfile(), mode = "wb", quiet = FALSE), 
            error = function(e) print(paste(file, 'did not work out')))    
    }
    options(warn = oldw)
    

    我在开始时使用options(warn = -1) 关闭警告以抑制无关的警告消息,并在最后恢复以前的设置。这将为您提供类似的输出

    # trying URL 'http://foo.com/bar.pdf'
    # [1] "http://foo.com/bar.pdf did not work out"
    # trying URL 'http://www.orimi.com/pdf-test.pdf'
    # Content type 'application/pdf' length 20597 bytes (20 KB)
    # ==================================================
    # downloaded 20 KB
    
    # trying URL 'http://bar.com/foo.pdf'
    # [1] "http://bar.com/foo.pdf did not work out"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 2014-05-26
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2019-10-06
      相关资源
      最近更新 更多