使用R的download.file批量下载PDF时跳过错误文件的方法
解决R中批量下载PDF时的错误跳过与提示问题
我明白你现在的困扰:批量下载PDF时,只要有一个文件下载失败,整个循环就停了,想让程序自动跳过出错的文件,还能打印出哪个文件出了问题。你提到用tryCatch是对的思路,只是之前的代码里把它放错位置啦,咱们来一步步修正。
首先先看你原来代码里的几个小问题:
- 循环的语法有误:
for (i in length(files)应该改成for (i in seq_along(files))(用seq_along比1:length(files)更安全,避免空列表时出现无效序列的问题) tryCatch的位置不对:你现在把print(name)包在了里面,但真正可能出错的是download.file,应该把这个函数放在tryCatch的表达式部分。- PDF链接匹配的正则有问题:
grepl("\\pdf", ...)会匹配带"pdf"字符串的任意链接,应该改成grepl("\\.pdf", ...)才会精准匹配PDF后缀。
下面是修改后的完整代码,我会在后面解释关键部分:
# 遍历每个文件链接 for (i in seq_along(files)) { # 读取网页内容 html <- read_html(files[i]) # 提取页面标题作为文件名 reads_name <- html_nodes(html, 'h1') name <- trimws(html_text(reads_name)) # 提取页面中的PDF链接 webpagelinks <- html_attr(html_nodes(html, "a"), "href") extract_pdf_link <- webpagelinks[grepl("\\.pdf", webpagelinks)] # 先判断是否找到PDF链接,避免无链接时出错 if (length(extract_pdf_link) == 0) { cat("警告:页面", name, "未找到PDF链接,跳过\n") next } # 用tryCatch包裹下载操作,捕获错误 tryCatch( expr = { download.file(extract_pdf_link, destfile = paste0(name, "_paper.pdf"), mode = "wb") cat("成功下载:", name, "\n") # 可选:打印成功提示,方便跟踪进度 }, error = function(e) { cat("下载失败:", name, ",错误信息:", e$message, "\n") # 捕获错误后无需额外操作,循环会自动继续执行下一个文件 } ) }
关键修改点说明:
- 循环遍历优化:用
seq_along(files)代替length(files),当files为空时不会出现无效的序列(比如1:0),让代码更健壮。 - PDF链接精准匹配:修正正则表达式为
\\.pdf,确保只提取真正的PDF文件链接,避免误下载其他带"pdf"字符串的文件。 - 空链接提前判断:在下载前先检查
extract_pdf_link的长度,如果为0(没找到PDF链接),直接打印提示并跳过当前循环,避免后续下载操作无意义报错。 - 正确使用tryCatch:把
download.file放在expr参数里,当这个函数执行出错时,会触发error参数里的匿名函数,在这个函数里我们可以打印出错的文件名和具体错误信息,而且捕获错误后循环会继续执行,不会终止。
这样修改后,程序遇到下载失败的情况就会自动跳过,同时告诉你哪个文件出了问题,还能看到具体的错误原因(比如链接失效、网络问题等),方便后续排查。
内容的提问来源于stack exchange,提问作者Carolin
相关产品推荐
相关产品推荐

