写在前面

NCBI 网址中提供有各种数据库,这里使用’ClinVar’数据库。从ClinVar数据库搜索氨基酸变化信息后, 获取搜索结果的相关信息。

biopython 提供了访问NCBI Entrez数据库的模块bio.Entrez , 中文文档在这里。

代码实现

需求:在ClinVar数据库中,根据输入的氨基酸变化信息,获取染色体的位置信息。
实现:1) 获取检索结果各条目的ID列表;2) 根据ID,获取条目信息,格式为xml格式;3) 解析xml,获取染色体位置信息等;4) 将获取的信息保存为字典;

使用NCBI Entrez数据库前,除了导入相应模块,还需要指定使用者的邮箱地址。

from Bio import Entrez
Entrez.email = "xxx@xxx.com"  # 邮箱地址
第一步:获取检索内容列表

指定要检索的数据库,最大检索条目数等。这里是检索"ClinVar"数据库,设定最大条目数为5。获取检索内容条目的ID列表使用Entrez.esearch(db, term, retmax),其中,db即为检索的数据库名称,一般为小写,term为检索的内容,retmax为检索条目最大值。返回的结果为字典形式,包括

dict_keys([‘Count’, ‘RetMax’, ‘RetStart’, ‘IdList’, ‘TranslationSet’, ‘TranslationStack’, ‘QueryTranslation’])

这里我们仅使用IdList获取检索内容ID列表即可。

QUERY_DB = "clinvar"  # 要检索的数据库,一般都是小写
MAX_TERM = 5  # 检索获取的结果条目数最大值def get_id_lst(query_info):  # 获取查询内容的信息ID"""query_info: 'GeneName ProChg', eg: 'EGFR p.Gly719Ala'"""term_handle = Entrez.esearch(db=QUERY_DB, term=query_info, retmax=MAX_TERM)records = Entrez.read(term_handle) # records.keys()id_lst = records['IdList']return id_lst
第二步:根据ID,获取xml格式条目信息

使用Entrez.efetch模块可获取指定ID列表的信息,使用read()方法获取文本内容(xml格式)。这里需要指定的四个参数:db还是ClinVar数据库,id为第一步获取的id列表,rettype指定为variationretmode格式为xml

一开始不知道指定rettype的值是什么,最终在Biostars上的问答区找到了,回答者还有提供在ClinVar数据库使用"variation"获取的具体内容示例(这里)。

def query_info(id_list):handle = Entrez.efetch(db=QUERY_DB, id=id_list, rettype="variation", retmode="xml")handle_info = handle.read()handle.close()return handle_info
第三步:解析xml,获取染色体位置信息

上一步已获取检索信息的xml格式文本,使用python中bs4.BeautifulSoup模块处理(bs4.BeautifulSoup的英文文档和中文文档)。获取的内容如下图,

这里用到的方法有:

  • find_all(name): 搜索当前tag中,名称为"name"的所有tag字节点。这里就是获取名称为VariationReport的tag的节点及其子节点的内容。该方法还有属性等其他参数: find_all( name , attrs , recursive , string , **kwargs ),这里暂时只用到名称。
  • attrs: 使用find_all获取的节点内容后,获取VariationIDVariationName属性,“VariationName"也可使用节点"Name"获取,由于"Name"仅有一个子节点,则使用report.Name.string获取。对于变异类型和氨基酸变化,也使用”.string"获取 “VariantType” 和 “ProteinChange”。
  • .children:这里使用的是Gene以获取基因相关信息,即可直接指定字节点的名称,并使用"attrs"获取相应的属性值。
  • 对于获取位置信息,类似的使用find_all(‘SequenceLocation’).

代码如下:

from bs4 import BeautifulSoup
from collections import OrderedDictREF_VS = "GRCh37"  # 获取染色体位置信息,使用GRCH37/hg19. 若为hg38, 请使用"GRCh38"def report_info_dict(handle_query_xml):reports_dict = OrderedDict()soup = BeautifulSoup(handle_query_xml, 'xml')  # lxmlreports = soup.find_all('VariationReport')if not reports:return {}for report in reports:var_id = report.attrs['VariationID']  # 变异信息IDvar_name = report.attrs['VariationName']  # 变异名称,包含转录本号,基因名称,核苷酸变化和氨基酸变化gene_name = report.Gene.attrs['Symbol']  # 基因名称var_type = report.VariantType.string  # 变异类型if report.ProteinChange:pro_change_abbr = report.ProteinChange.string  # 可能有多种else:pro_change_abbr = "NotFound ProteinChange"locations = report.find_all('SequenceLocation')  # 位置信息for seq_loc in locations:if seq_loc.attrs['Assembly'] == REF_VS:chrom = seq_loc.attrs['Chr']  # 染色体号start = seq_loc.attrs['display_start']  # display_start; innerStart, startstop = seq_loc.attrs['display_stop']reports_dict[var_id] = [var_name, var_type, gene_name, pro_change_abbr, chrom, start, stop]return reports_dict

问题:检索的结果中有多条,有的结果可能不是对应输入检索的氨基酸变化信息,只是包含输入的内容。
解决:可通过最后获取的字典,进行正则匹配。(暂无实现代码)
注:
– 对SNP的氨基酸变化,匹配方式固定,eg: 匹配p.Arg225Ter,p.([A-Za-z]{3})([0-9]+)([A-Za-z]{3})
– 但对INDEL或者有frameshift的氨基酸变化,匹配的格式可能较多,有:p.Ser719del,p.Thr1018fs,p.Leu747_Pro753delinsSer等,如果格式与ClinVar数据库中提供的格式相同,检索结果相对一致,如果格式有差异,则检索结果的准确性则会降低。
– 如果氨基酸名称简写为1个字母,可考虑转换为3个字母写法,或者匹配获取内容的氨基酸变化信息,但后者在INDEL时ClinVar检索结果中可能没有氨基酸变化信息。因此,最好还是转换为3个字母的格式。对于氨基酸变化的格式标准应该遵循HGVS的标准规范。


汇总以上代码:

from Bio import Entrez
from bs4 import BeautifulSoup
from collections import OrderedDictEntrez.email = "xxx@xxx.com"  # 输入邮箱地址
QUERY_DB = "clinvar"  # 要检索的数据库,一般都是小写
REF_VS = "GRCh37"  # 获取染色体位置信息,使用GRCH37/hg19. 若为hg38, 请使用"GRCh38"
MAX_TERM = 5  # 检索获取的结果条目数最大值query_i = 'EGFR p.Gly719Ala'  # 示例 要查询的信息
query_i1 = 'EGFR p.Gly719'
query_info2 = 'BRCA1 p.Q1756fs'
q_i1 = 'EGFR p.D770_N771insG'
q_i2 = 'EGFR p.E746_A750delELREA'def get_id_lst(query_info):  # 获取查询内容的信息ID"""query_info: 'GeneName ProChg', eg: 'EGFR p.Gly719Ala'"""term_handle = Entrez.esearch(db=QUERY_DB, term=query_info, retmax=MAX_TERM)records = Entrez.read(term_handle) # records.keys()id_lst = records['IdList']return id_lstdef query_info(id_list):handle = Entrez.efetch(db=QUERY_DB, id=id_list, rettype="variation", retmode="xml")handle_info = handle.read()handle.close()return handle_infodef report_info_dict(handle_query_xml):reports_dict = OrderedDict()soup = BeautifulSoup(handle_query_xml, 'xml')  # lxmlreports = soup.find_all('VariationReport')if not reports:return {}for report in reports:var_id = report.attrs['VariationID']var_name = report.attrs['VariationName']gene_name = report.Gene.attrs['Symbol']var_type = report.VariantType.stringif report.ProteinChange:pro_change_abbr = report.ProteinChange.stringelse:pro_change_abbr = "NotFound ProteinChange"locations = report.find_all('SequenceLocation')for seq_loc in locations:if seq_loc.attrs['Assembly'] == REF_VS:chrom = seq_loc.attrs['Chr']start = seq_loc.attrs['display_start']  # display_start; innerStart, startstop = seq_loc.attrs['display_stop']reports_dict[var_id] = [var_name, var_type, gene_name, pro_change_abbr, chrom, start, stop]return reports_dictdef simple_report_dict(gene, pro_change):query_item = str(gene) + ' ' + str(pro_change)ids = get_id_lst(query_item)h_q_info = query_info(ids)reports_d = report_info_dict(h_q_info)return reports_dprint(simple_report_dict('EGFR', 'p.Gly719Ala'))

<完>

根据氨基酸变化,从NCBI - ClinVar数据库抓取信息(基于python - BeautifulSoup)相关推荐

  1. python可用于数据抓取_基于PYTHON实现证券数据的抓取,以PYECHARTS实现证券数据实时分析...

    by Tony 主要采用Java+Python+MySQL+Redis的方式建设,以满足前期数据量较小的场景下,实时分析预警的要求.使用JAVA搭建核心框架:Python用于数据采集应用.数据分析模型 ...

  2. 《精通Wireshark》—第1章1.5节抓取信息的方式

    本节书摘来自异步社区<精通Wireshark>一书中的第1章1.5节抓取信息的方式,作者[印度]Charit Mishra(夏里特 米什拉),更多章节内容可以访问云栖社区"异步社 ...

  3. 【机器人识别抓取】基于视觉的机器人抓取——从物体定位、物体姿态估计到平行抓取器抓取估计

    目录 导读 1 引言 1.1 抓取综合方法 1.2 基于视觉的机器人抓取系统 2 抓取检测.视觉伺服和动态抓取 2.1抓取检测 2.2 视觉伺服控制 2.3 动态抓取 3 本文实现的方法 3.1 网络 ...

  4. python爬取大众点评评论_python爬虫抓取数据 小试Python——爬虫抓取大众点评上的数据 - 电脑常识 - 服务器之家...

    python爬虫抓取数据 小试Python--爬虫抓取大众点评上的数据 发布时间:2017-04-07

  5. PHP PDF内容识别 抓取信息 方法

    PHP PDF内容识别 抓取信息 方法 PDF Parser 使用 PDF Parser 参考:http://www.pdfparser.org/ (注意:composer.json 更新 pdfpa ...

  6. python数据库抓取并保存_python:微信消息抓取、转发和数据库存储及源码

    前言 python的强大在于丰富的类库,经常会看到几行代码就可以实现非常强大的功能.它可以做爬虫.AI.自动化测试.小工具(抢票.抓包.微信消息抓取)等等. 本次我们来讲讲怎么来抓取微信消息?抓取微信 ...

  7. php爬虫抓取信息及反爬虫相关

    php爬虫首推Curl函数了,先来认识下它. 0x01.curl扩展的安装: 1.确保php子文件夹ext里面有php_curl.dll(一般都有的,一般配置时候会设置环境变量的) 2.将php.in ...

  8. pyspider抓取伯乐在线python相关所有文章

    有点软用的pyspider中文文档(这个翻译的和谷歌翻译差不多,如果没有谷歌翻译插件的可以考虑) 英文官方文档(谷歌翻译后完全能看懂,不像python官方的,第三方库的都比较友好) 伯乐在线pytho ...

  9. python统计自己微信好友并抓取信息

    前几天统计自己好友性别,看看男女比例,发现竟然还有分类不是男女的,很好奇都是谁,所以空闲下来抓取所有好友看一下. 这边使用了itchat库,网上资料很多.不多说,直接上代码 import itchat ...

最新文章

  1. JS的事件对象和事件冒泡
  2. 佳能g3800故障灯说明书_汽车仪表灯的使用方法以及注意事项
  3. 王者荣耀用什么开发引擎做的?
  4. 账户Account类文件编写(static成员使用)
  5. boost asio io_context 没任务不退出
  6. linux7.0启用图形界面,CentOS 7 设置图形界面启动
  7. MYSQL修改传输数据包大小值(max_allowed_packet)
  8. 实现数组头尾两端元素对调代码
  9. chmod 755 究竟是什么鬼
  10. 泰克示波器存储格式,在存储时怎么选择?
  11. 【无人机学习】无人机基础知识
  12. 【时间序列】多变量时间序列异常检测数据集整理及标准化处理代码合集
  13. 实战录 | 前端性能优化二三事儿
  14. uniapp css实现轮播图片逐渐放大效果
  15. 利用tcp三次握手,使用awl伪装MAC地址进行多线程SYN洪水攻击
  16. 加拿大计算机硕士gpa不够,申请加拿大硕士课程有GPA不足的硬伤怎么办?
  17. 论文译文——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  18. Lotus配置之六:IBM Lotus Note添加公共邮箱
  19. Win10使用VS2017安装Caffe详细总结
  20. CDA-Community Data Access规则

热门文章

  1. 华胜天成水利水务应急指挥通信车解决方案
  2. 2011-2019年地级市数字经济数据(含stata代码)
  3. 质量员考试建筑八大员考试消防建筑设施施工质量存在的问题
  4. 2023年湖北武汉八大员七大员证怎么报考?个人可以报名吗?启程别
  5. 底部带导航的android app,【续】Android App之底部tab导航常用实现方案总结
  6. 撰写生活(学习向) - 好久不见 持续更新 21/03/15
  7. 全息投影必须要有全息介质吗?
  8. 什么是客户忠诚度?跨境电商如何提高客户忠诚度?
  9. 又有大厂员工连续加班倒下/ 百度搜狗取消快照/ 马斯克生父不为他骄傲...今日更多新鲜事在此...
  10. html中的mata标签的作用