如何用python获取文献_[python]eutilities获取文献题录
之前这篇文章(路人乙小明:用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获取文献题录相关推荐
- python 病毒 基因_#Python#提取基因对应的蛋白质名
提取基因对应的蛋白质官方名 最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,Uniprot作为处理蛋白质的大佬,结果里都有,肯定有办法能够满足需求. 搜索TP5 ...
- python办公自动化代码_[Python] 自动化办公 邮件操作基础知识及代码(下)
转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒) 若公众号内转载请联系公众号:早起Python 这篇文章能学到的主要内容: imbox 收取邮件 poplib 收取 ...
- python keyboard模块_[python] PyMouse、PyKeyboard用python操作鼠标和键盘
1.PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用.支持的平台及依赖如下: Linux - Xlib Mac - Quartz, ...
- springboot相关书籍文献_国内民国时期文献酸化调研与思考
来源:<新世纪图书馆>2017年 第9期 作者:陈绪军 南京图书馆 --基于国内五家大型公共图书馆调研结果 摘要:根据 GB/T13528-1992<纸和纸板表面 PH 值的测定 ...
- 如何用python找文献_如何高效查找文献、紧跟研究领域热点和前沿?
如何高效查找文献.紧跟研究领域热点和前沿? 每一次"论文手术" ,都令人头秃: 在知网.各大论坛的海量文献里挣扎,一耗就是一天,筛出的可用信息并不多: 整合搜罗到的数据.案例和实验 ...
- python 股票数据_从互联网获取股票数据(历史数据,Python + MySQL)
目标 从互联网(网易数据接口)获取股票历史数据,包括开盘价.最高价.最低价.收盘价等等 环境 Python 3.6 MySQL 5.6.34 table: stock_list 记录数:3592 条, ...
- 用python读取股票价格_雅虎API获取股票数据--Python
好久不学Python,计划用Tkinter写一个利用雅虎免费股票查询API的可视化程序 Yahoo股票报价API 获取实时数据 请求url:http://finance.yahoo.com/d/quo ...
- python连通域标记_使用OpenCV获取图片连通域数量,并用不同颜色标记函
一,原图和效果图 二,代码 //#########################产生随机颜色######################### cv::Scalar icvprGetRandomCo ...
- 网易python公开课_如何批量获取网易公开课Request Url?
这个可能跟python关系不大了,从网络请求可以看到,在请求flv之前,有个xml的请求: http://live.ws.126.net/movie/D/K/2_M82ICR1D9_M83C881DK ...
最新文章
- 彩云国物语片头曲_はじまりの風
- ios 上运行linux,你可曾想过在iOS上跑Linux?
- python自带的url提取器
- python 2.7 error: Microsoft Visual C++ 9.0 is required
- Web开发小结 - 2
- 2019测试学习路线图,内附完整自学路线+视频+工具
- P2525 Uim的情人节礼物·其之壱 prev_permutaion
- ListView分页加载数据
- 分享一份软件测试面试指南
- android居中代码,android 设置textView水平居中显示?
- 【diannaoxitong】word安全模式怎么解除?word安全模式快速解除方法
- axios+springboot 报错 POST http://localhost:8080/Login 404 (Not Found)
- 导出多个sheet的Excel以及在服务器上压缩文件然后再导出(在这里是压缩一个excel后导出)
- 湖北省安陆市发展怎么样
- JAVA的教师档案管理系统_教师档案管理系统的设计与实现
- 如何优雅的完成一场说来就来的APP自建
- 电竞达人最爱五款真无线蓝牙耳机,听声辨位低延迟TWS蓝牙耳机助你《夺冠》
- waitpid() 做人要厚道
- php 对字母排序,PHP按字母顺序排序
- 天润融通呼叫中心破教育机构分布式难题