之前这篇文章(路人乙小明:用entrez eutilities来查pubmed文献)提过如何利用entrez eutilities查找文献。当时在最后面获取论文摘要和题录的部分直接用了text的模式。最近觉得用xml模式能获得更加细致的数据。比如我如果只想获得题目,杂志,一作,doi这几个信息,如果直接用text获取摘要,然后再用regex就比较容易出错,但是xml就不会有这样的问题(大概……)

况且用python重新写一下那段程序也是好的。

导入各种包

import requests

import os

import xml.etree.ElementTree as ET

import pyperclip

import argparse

import re

requests需要自己安装,是很方便的一个获取网络信息的工具。

os当时导进来主要是为了删除写入的临时文件(os.remove()),调试程序的时候总不能每次都从entrez读数据吧,一来比较慢,二来万一整天发请求会被封的。

xml.etree.ElementTree是python自带的xml解析工具

pyperclip是读取剪切板的工具

argparse是加入命令行参数的工具

re就是正则的包

参数和其他信息准备

reLink = re.compile(r'https://www.ncbi.nlm.nih.gov/pubmed/(\d+)')

parser = argparse.ArgumentParser(

"-i pmid -l pubmed link")

parser.add_argument('-i')

parser.add_argument('-l')

parser.add_argument('-verbose')

parser.add_argument('-paste')

args = parser.parse_args()

if args.i is not None:

print(args.i)

ids = args.i

elif args.p is not None:

ids = re.search(reLink,pyperclip.paste()).group(1)

if ids is None:

raise Exception("link format is wrong")

elif args.l is not None:

print(args.l)

ids = re.search(reLink,args.l).group(1)

if ids is None:

raise Exception("link format is wrong")

else:

ids = '30693853'

dbname = 'pubmed'

其实从entrez找文章的摘要,最核心的命令是

fetchedData = requests.get(

f"""https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db={dbname}&id={ids}&rettype=abstract&retmode=XML"""

)

需要提供的参数是下面4个:db:数据库名称,我们这里设置成pubmed

id:记录条目的id,这里是指一个文章的pmid

rettype:获取内容类型,这里使用abstract

retmode:内容方式,这里使用XML

requests在get了entrez返回的数据以后:

with open('out.xml', 'w', encoding='utf8') as xmlFile:

xmlFile.write(fetchedData.text)

#调试完成以后直接读取requests get到的数据,out.xml只作暂存之用

rstDict = xmlParse(fetchedData.text)

#用format,按照输出格式将提取的数据合成文本

txt = """title: {}journal: {}, {}-{}, {}author: {}, et al.doi: {}""".format(

rstDict['title'],

rstDict['journal']['title'],

rstDict['journal']['volume'],

rstDict['journal']['issue'],

rstDict['journal']['pubyear'],

rstDict['authors'][0],

rstDict['doi']

)

abstracts = "abstract:\n".join(["{}:\n{}".format(k, v)

for k, v in rstDict['abstract'].items()])

# 使用verbose参数决定是否输出摘要

if args.verbose is not None:

txt = txt+abstracts

pyperclip.copy(txt)

print(txt)

xmlParse这个函数

整个程序主要的部分就是这个函数。我的实现方法比较naive,也没有对xml作安全性的防范。

def xmlParse(strtxt):

root = ET.fromstring(strtxt)

rstDict = {}

rstDict['pmid'] = root.find('./PubmedArticle/MedlineCitation/PMID').text

rstDict['journal'] = root.find('./PubmedArticle/MedlineCitation/Article/Journal')

rstDict['journal'] = {

'volume': rstDict['journal'].find('./JournalIssue/Volume').text,

'issue': rstDict['journal'].find('./JournalIssue/Issue').text,

'pubyear': rstDict['journal'].find('./JournalIssue/PubDate').text,

'title': rstDict['journal'].find('./Title').text,

'abbrev': rstDict['journal'].find('./ISOAbbreviation').text,

}

rstDict['title'] = root.find('./PubmedArticle/MedlineCitation/Article/ArticleTitle').text

rstDict['doi'] = [e for e in root.findall(

'./PubmedArticle/PubmedData/ArticleIdList/ArticleId') if e.get('IdType')=='doi'][0].text

rstDict['abstract'] = root.find(

'./PubmedArticle/MedlineCitation/Article/Abstract')

abstractLabels = [e.get('Label') for e in rstDict['abstract'].findall('AbstractText')]

abstractText = [

e.text for e in rstDict['abstract'].findall('AbstractText')]

rstDict['abstract'] = dict(zip(abstractLabels,abstractText))

rstDict['authors'] = root.find(

'./PubmedArticle/MedlineCitation/Article/AuthorList')

authorsList = rstDict['authors'].findall('Author')

rstDict['authors'] = ["{}, {}({})".format(

e.find('LastName').text,

e.find('ForeName').text,

e.find('Initials').text) for e in authorsList]

return rstDict

这个函数主要由两类操作,一类就是直接能够通过text属性获取数据的,比如像rstDict['pmid']= root.find('./PubmedArticle/MedlineCitation/PMID').text这样的东西。这类只需要确定好xml节点的xpath,弄进find函数就没问题了。

另外一类,比如像authorsList这种,数量不定,返回的数据(rstDict['authors']) 是数据形式,就需要把find函数和findall函数联合起来用:

......

rstDict['authors'] = root.find(

'./PubmedArticle/MedlineCitation/Article/AuthorList')

authorsList = rstDict['authors'].findall('Author')

rstDict['authors'] = ["{}, {}({})".format(

e.find('LastName').text,

e.find('ForeName').text,

e.find('Initials').text) for e in authorsList]

使用的时候可以先复制一个文章的url,,然后用的时候可以先复制一个文章的url,比如https://www.ncbi.nlm.nih.gov/pubmed/7450738/,然后 运行程序,外加一个-p的参数, 程序就可以读取剪贴板然后将简化的题录放回剪贴板。

如何用python获取文献_[python]eutilities获取文献题录相关推荐

  1. python 病毒 基因_#Python#提取基因对应的蛋白质名

    提取基因对应的蛋白质官方名 最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,Uniprot作为处理蛋白质的大佬,结果里都有,肯定有办法能够满足需求. 搜索TP5 ...

  2. python办公自动化代码_[Python] 自动化办公 邮件操作基础知识及代码(下)

    转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒) 若公众号内转载请联系公众号:早起Python 这篇文章能学到的主要内容: imbox 收取邮件 poplib 收取 ...

  3. python keyboard模块_[python] PyMouse、PyKeyboard用python操作鼠标和键盘

    1.PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用.支持的平台及依赖如下: Linux - Xlib Mac - Quartz, ...

  4. springboot相关书籍文献_国内民国时期文献酸化调研与思考

    来源:<新世纪图书馆>2017年 第9期 作者:陈绪军   南京图书馆 --基于国内五家大型公共图书馆调研结果 摘要:根据 GB/T13528-1992<纸和纸板表面 PH 值的测定 ...

  5. 如何用python找文献_如何高效查找文献、紧跟研究领域热点和前沿?

    如何高效查找文献.紧跟研究领域热点和前沿? 每一次"论文手术" ,都令人头秃: 在知网.各大论坛的海量文献里挣扎,一耗就是一天,筛出的可用信息并不多: 整合搜罗到的数据.案例和实验 ...

  6. python 股票数据_从互联网获取股票数据(历史数据,Python + MySQL)

    目标 从互联网(网易数据接口)获取股票历史数据,包括开盘价.最高价.最低价.收盘价等等 环境 Python 3.6 MySQL 5.6.34 table: stock_list 记录数:3592 条, ...

  7. 用python读取股票价格_雅虎API获取股票数据--Python

    好久不学Python,计划用Tkinter写一个利用雅虎免费股票查询API的可视化程序 Yahoo股票报价API 获取实时数据 请求url:http://finance.yahoo.com/d/quo ...

  8. python连通域标记_使用OpenCV获取图片连通域数量,并用不同颜色标记函

    一,原图和效果图 二,代码 //#########################产生随机颜色######################### cv::Scalar icvprGetRandomCo ...

  9. 网易python公开课_如何批量获取网易公开课Request Url?

    这个可能跟python关系不大了,从网络请求可以看到,在请求flv之前,有个xml的请求: http://live.ws.126.net/movie/D/K/2_M82ICR1D9_M83C881DK ...

最新文章

  1. 彩云国物语片头曲_はじまりの風
  2. ios 上运行linux,你可曾想过在iOS上跑Linux?
  3. python自带的url提取器
  4. python 2.7 error: Microsoft Visual C++ 9.0 is required
  5. Web开发小结 - 2
  6. 2019测试学习路线图,内附完整自学路线+视频+工具
  7. P2525 Uim的情人节礼物·其之壱 prev_permutaion
  8. ListView分页加载数据
  9. 分享一份软件测试面试指南
  10. android居中代码,android 设置textView水平居中显示?
  11. 【diannaoxitong】word安全模式怎么解除?word安全模式快速解除方法
  12. axios+springboot 报错 POST http://localhost:8080/Login 404 (Not Found)
  13. 导出多个sheet的Excel以及在服务器上压缩文件然后再导出(在这里是压缩一个excel后导出)
  14. 湖北省安陆市发展怎么样
  15. JAVA的教师档案管理系统_教师档案管理系统的设计与实现
  16. 如何优雅的完成一场说来就来的APP自建
  17. 电竞达人最爱五款真无线蓝牙耳机,听声辨位低延迟TWS蓝牙耳机助你《夺冠》
  18. waitpid() 做人要厚道
  19. php 对字母排序,PHP按字母顺序排序
  20. 天润融通呼叫中心破教育机构分布式难题

热门文章

  1. 计算机网络原理 作业
  2. 小程序引用公共js,不看可惜了!!
  3. 2022年,有哪些小本生意可以做
  4. Python cv2(Opencv) Canny边缘检测 和 傅里叶变换
  5. T100——q查询,子母查询(汇总——明细)练习笔记
  6. 使用正则表达式批量去除第一个逗号前的内容(含逗号)以及去除最后一个逗号后面的内容
  7. 如何查看域控计算机是哪个用户登陆,查看域控制器上登录用户
  8. 百度开放云 视频转码服务
  9. java简介,java特点,java应用领域
  10. 传统蓝牙和低功耗蓝牙的分类与区别?