Python解析PubMed XML需先用Biopython Entrez获取数据(设邮箱、控频次),再用ElementTree解析嵌套结构:标题//ArticleTitle、摘要//AbstractText、作者//AuthorList/Author等,注意命名空间、字段缺失及HTML标签清理,最后封装为返回结构化字典列表的健壮函数。
用Python解析PubMed的XML数据,核心是读取NCBI提供的XML格式文献记录(如通过Entrez.esearch和Entrez.efetch获取),再用标准库xml.etree.ElementTree或第三方库(如lxml)提取所需字段。关键不在于“能不能”,而在于理解PubMed XML的嵌套结构和常用标签路径。
先通过Biopython的Entrez模块获取原始XML。需设置邮箱(NCBI强制要求),并指定数据库、检索词和返回格式:
Entrez.esearch获取PMID列表(限制条数避免超时)Entrez.efetch,参数rettype="xml"确保返回XML而非摘要文本time.sleep(1))和编码问题(响应默认为字节,需解码为字符串)PubMed XML是典型的嵌套层级结构,顶层为PubmedArticleSet,每个文献是PubmedArticle,内部包含MedlineCitation和PubmedData两大部分。常用字段路径示例:
.//ArticleTitle/text()
.//AbstractText/text()(可能有多个AbstractText节点,含Label属性区分背景/方法等).//AuthorList/Author/LastName/text() 和 .//AuthorList/Author/Initials/text()
.//ArticleId[IdType="doi"]/text()
.//PubDate/Year/text()(注意有些只有MedlineDate,需回退提取)实际解析中容易踩坑,需针对性处理:
xmlns="http://www.nlm.nih.gov/..."),直接用find()会失败。解决方法:忽略命名空间(用{*}通配符)或预定义命名空间字典传入findall()
find()而非
findtext(),再判空,避免AttributeError&、等实体,ElementTree会自动解码;但AbstractText可能含等HTML标签,需额外清理(如用re.sub(r"]+>", "", text))
把获取+解析逻辑打包,输入关键词和最大返回数,输出结构化字典列表:
PubmedArticle节点单独解析,避免因某条数据异常中断全部流程