根据 NCBI 帮助台回答的问题之一,我们不能“批量下载” PubMed Central。但是,我是否可以使用“NCBI E-utilities”通过Efetch下载 PMC 数据库中的所有全文论文,或者至少在 Entrez Programming Utilities 中使用 Esearch 找到所有相应的PMCid ?如果是,那么如何?如果不能使用E-utilities,有没有其他方法可以下载所有全文文章?
2 回答
首先,在您批量下载文件之前,我强烈建议您阅读E-utilities 使用指南。
如果您想要全文文章,您将希望将搜索限制为打开访问文件。此外,如果您想要任何好的文章,我建议您也将搜索限制在 Medline 文章中。然后你就可以进行搜索了。
使用 Biopython,这给了我们:
search_query = 'medline[sb] AND "open access"[filter]'
# getting search results for the query
search_results = Entrez.read(Entrez.esearch(db="pmc", term=search_query, retmax=10, usehistory="y"))
您可以使用PMC 网站上的搜索功能,它会显示生成的查询,您可以将其复制/粘贴到您的代码中。现在您已经完成了搜索,您可以实际下载文件:
handle = Entrez.efetch(db="pmc", rettype="full", retmode="xml", retstart=0, retmax=int(search_results["Count"]), webenv=search_results["WebEnv"], query_key=search_results["QueryKey"])
- 您可能希望通过更改
retstart
和retmax
循环中的变量来批量下载,以避免淹没服务器。 - 如果
handle
仅包含一个文件,handle.read()
则将整个 XML 文件作为字符串包含。如果它包含更多,则文章包含在<article></article>
节点中。 - 全文仅在 XML 中可用,而 pubmed 中可用的默认解析器不处理 XML 名称空间,因此您将自己使用ElementTree(或其他解析器)来解析您的 XML。
- 在这里,由于 E-utilities 的内部历史记录可以找到这些文章,该历史记录通过参数访问并
webenv
启用,这要归功于usehistory="y"
Entrez.read()
关于使用 ElementTree 解析 XML 的一些提示: 您不能删除孙节点,因此您可能想要递归地删除一些节点。node.text
返回 中的文本node
,但只返回第一个子节点,因此"".join(node.itertext())
如果要获取给定节点中的所有文本,则需要按照以下方式执行操作。
根据 NCBI Help Desk 回答的问题之一,我们不能“批量下载”PubMed Central。
https://www.nlm.nih.gov/bsd/medline.html + https://www.ncbi.nlm.nih.gov/pmc/tools/openftlist/将下载其中的很大一部分(我不知道百分比)。如https://www.ncbi.nlm.nih.gov/pmc/tools/openftlist/中所述,它确实会错过许可证不允许重新分发的 PMC 全文文章。