我有需要从 PubMed 网站下载的文件的 PubMed ID.pdf
格式。我尝试过这个脚本:
#!/usr/bin/env bash
Link="http://www.ncbi.nlm.nih.gov/pubmed/"
ID=(10021369
10051005
10051007
100562
10064668
10071185
)
for f in ${ID[]};
do
wget --user-agent="Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" \
-l1 --no-parent -A.pdf ${Link}${f}/pdf/ -O ${f}.pdf
done
这给了我 PDF 文件,但我无法打开其中任何一个。我究竟做错了什么?
答案1
您为什么希望能够从该 URL 下载 PDF? PubMed 通常不提供 PDF,它会为您提供该期刊网页的链接,您可以从那里获取 PDF。
不管怎样,你的脚本没问题,问题是你给它的链接不是指向 PDF 文件,而是指向 XML 文件,这就是它正在下载的内容:
$ ls
10021369.pdf 10051007.pdf 10064668.pdf
10051005.pdf 100562.pdf 10071185.pdf
$ file *
10021369.pdf: XML document text
10051005.pdf: XML document text
10051007.pdf: XML document text
100562.pdf: XML document text
10064668.pdf: XML document text
10071185.pdf: XML document text
为了让它下载 PDF,您需要为其提供指向 PDF 文件的链接。您可以通过将浏览器指向脚本访问的链接之一来测试这一点。例如,http://www.ncbi.nlm.nih.gov/pubmed/10051005/pdf/。如果您访问该链接,您会发现它不是 PDF 文件。
如果您的所有 PMID 都是 PubMed Central 中论文的链接,那么您应该能够在首先将 PubMed ID 转换为 PubMed Central ID 后获取 PDF:
#!/usr/bin/env bash
Link="http://www.ncbi.nlm.nih.gov/pubmed/"
PMCLink="http://www.ncbi.nlm.nih.gov/pmc/articles/"
ID=(10021369
10051005
10051007
100562
10064668
10071185
)
for f in ${ID[@]};
do
PMCID=$(wget --user-agent="Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" \
-l1 --no-parent ${Link}${f} -O - 2>/dev/null | grep -Po 'PMC\d+' | head -n 1)
if [ $PMCID ]; then
wget --user-agent="Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" \
-l1 --no-parent -A.pdf ${PMCLink}${PMCID}/pdf/ -O ${f}.pdf 2>/dev/null
else
echo "No PMC ID for $f"
fi
done
运行此脚本将从您提供的 ID (10051005.pdf
和10051007.pdf
) 下载 2 个免费可用的 PDF,并打印其余的错误:
No PMC ID for 10021369
No PMC ID for 100562
No PMC ID for 10064668
No PMC ID for 10071185
您必须手动获取其余部分或弄清楚如何解析相关 URL。
答案2
这应该可以解决问题。截至 2016 年 5 月,作者似乎仍在积极维护代码。