如何用Python解析PubMed的XML数据

发布时间 - 2025-12-26 00:00:00    点击率:
Python解析PubMed XML需先用Biopython Entrez获取数据(设邮箱、控频次),再用ElementTree解析嵌套结构:标题//ArticleTitle、摘要//AbstractText、作者//AuthorList/Author等,注意命名空间、字段缺失及HTML标签清理,最后封装为返回结构化字典列表的健壮函数。

用Python解析PubMed的XML数据,核心是读取NCBI提供的XML格式文献记录(如通过Entrez.esearchEntrez.efetch获取),再用标准库xml.etree.ElementTree或第三方库(如lxml)提取所需字段。关键不在于“能不能”,而在于理解PubMed XML的嵌套结构和常用标签路径。

获取PubMed XML数据

先通过Biopython的Entrez模块获取原始XML。需设置邮箱(NCBI强制要求),并指定数据库、检索词和返回格式:

  • 使用Entrez.esearch获取PMID列表(限制条数避免超时)
  • 用这些PMID调用Entrez.efetch,参数rettype="xml"确保返回XML而非摘要文本
  • 注意处理HTTP错误、频率限制(加time.sleep(1))和编码问题(响应默认为字节,需解码为字符串)

用ElementTree解析XML结构

PubMed XML是典型的嵌套层级结构,顶层为PubmedArticleSet,每个文献是PubmedArticle,内部包含MedlineCitationPubmedData两大部分。常用字段路径示例:

  • 标题.//ArticleTitle/text()
  • 摘要.//AbstractText/text()(可能有多个AbstractText节点,含Label属性区分背景/方法等)
  • 作者列表.//AuthorList/Author/LastName/text().//AuthorList/Author/Initials/text()
  • DOI.//ArticleId[IdType="doi"]/text()
  • 出版年份.//PubDate/Year/text()(注意有些只有MedlineDate,需回退提取)

处理常见陷阱

实际解析中容易踩坑,需针对性处理:

  • 命名空间问题:PubMed XML带默认命名空间(如xmlns="http://www.nlm.nih.gov/..."),直接用find()会失败。解决方法:忽略命名空间(用{*}通配符)或预定义命名空间字典传入findall()
  • 缺失字段:不是每篇都有摘要、DOI或完整作者名。务必用find()而非findtext(),再判空,避免AttributeError
  • 特殊字符与换行:标题/摘要中含&等实体,ElementTree会自动解码;但AbstractText可能含等HTML标签,需额外清理(如用re.sub(r"]+>", "", text)

封装成可复用函数

把获取+解析逻辑打包,输入关键词和最大返回数,输出结构化字典列表:

  • 函数内统一处理异常(URLError、HTTPError、ParseError)
  • 对每个PubmedArticle节点单独解析,避免因某条数据异常中断全部流程
  • 返回字段建议包括:pmid、title、abstract、authors(列表)、year、doi、journal,便于后续存CSV或导入pandas


# python  # html  # go  # 编码  # 字节  # csv  # 解决方法  # 邮箱  # 标准库 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何升级到最新版本?(升级指南和步骤)  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Linux网络带宽限制_tc配置实践解析【教程】  如何在橙子建站上传落地页?操作指南详解  Laravel如何生成URL和重定向?(路由助手函数)  Python并发异常传播_错误处理解析【教程】  高端企业智能建站程序:SEO优化与响应式模板定制开发  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  如何制作一个表白网站视频,关于勇敢表白的小标题?  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel怎么连接多个数据库_Laravel多数据库连接配置  详解MySQL数据库的安装与密码配置  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何快速选择适合个人网站的云服务器配置?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel怎么在Controller之外的地方验证数据  ,怎么在广州志愿者网站注册?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Python文件操作最佳实践_稳定性说明【指导】  如何在云主机快速搭建网站站点?  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  如何快速完成中国万网建站详细流程?  如何在阿里云域名上完成建站全流程?  如何在云主机上快速搭建多站点网站?  如何在云服务器上快速搭建个人网站?  高防服务器租用指南:配置选择与快速部署攻略  如何在IIS服务器上快速部署高效网站?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  开心动漫网站制作软件下载,十分开心动画为何停播?  如何彻底删除建站之星生成的Banner?  JavaScript实现Fly Bird小游戏  大同网页,大同瑞慈医院官网?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel怎么判断请求类型_Laravel Request isMethod用法  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Win11怎么设置默认图片查看器_Windows11照片应用关联设置