1

我有一份想要转换为 BibTeX 记录的 DOI 列表。bib2doi 包似乎不起作用,所以我使用 R 的 curl 包编写了以下代码来扫描列表,创建 bibtex 记录并将其附加到文件中。它适用于许多 DOI,但它会为 DOI 返回此(Failed to connect to data.chinadoi.cn port 80: Connection refused)错误10.11975/j.issn.1002-6819.2017.z1.035。我想不通的是如何写出错误的 DOI 并继续前进。这是包含三个 DOI 的代码,第二个 DOI 是失败的。

library(curl)
DOIlist <- c("10.1111/1748-5967.12330", "10.11975/j.issn.1002-6819.2017.z1.035", "10.1016/j.envsci.2019.03.017")

h <- new_handle()
handle_setheaders(h, "accept" = "application/x-bibtex")

for (i in 1:length(DOIlist)) {
  url <- paste0("https://doi.org/", DOIlist[i])
  print(paste0("url: ", url))
  curl_download(url, destfile = "curltest.bib", handle = h, mode = "a")
}
4

2 回答 2

4

如果您希望在for由于 DOI 错误而引发错误后继续循环,您可以将curl_download()调用包装在try(). 它仍然会抛出错误,但您的循环将继续进行:

library(curl)
DOIlist <- c("10.1111/1748-5967.12330", "10.11975/j.issn.1002-6819.2017.z1.035", "10.1016/j.envsci.2019.03.017")

h <- new_handle()
handle_setheaders(h, "accept" = "application/x-bibtex")

for (i in 1:length(DOIlist)) {
  url <- paste0("https://doi.org/", DOIlist[i])
  print(paste0("url: ", url))
  try(curl_download(url, destfile = "curltest.bib", handle = h, mode = "a"))
}
于 2019-08-03T17:03:06.063 回答
2

我尝试运行代码,生成的 .bib 文件只有一个条目。它似乎没有附加它们。下面是一个截图。还有其他人有这个问题吗?此外,字符串中的第三个 DOI 会导致Connection timed out after 10014 milliseconds错误。

在此处输入图像描述

我在另一个帖子上找到了答案。这是我用来让它工作的代码

pacman::p_load(curl,readr, tidyverse) # load required packages

urls <- c("https://doi.org/10.1016/j.tvjl.2017.12.021", "https://doi.org/10.1016/j.yqres.2013.10.005") 
walk(urls, ~ {
  curl(., handle = h) %>%
    readLines(warn = FALSE) %>%
    write(file = "Desktop\\test.bib", append = TRUE) 
})

read_delim("Desktop\\test.bib", delim = "\n") # this will add break lines to your bib file you created
于 2020-09-16T16:09:32.897 回答