如果想从Uniprot的API中提取individual entries的所有信息,如:P12345
,则可以通过下述方法:
https://www.uniprot.org/uniprot/P12345.txt
https://www.uniprot.org/uniprot/P12345.xml
https://www.uniprot.org/uniprot/P12345.rdf
https://www.uniprot.org/uniprot/P12345.fasta
https://www.uniprot.org/uniprot/P12345.gff
其中.txt
和.xml
的结果是一致的,包含了最全的信息(相当于将这个http://www.uniprot.org/uniprot/P12345网页中的所有信息整合在一个文件中);其他格式的则是包含了其部分信息。但是如果想批量处理多个uniprot ID,则需要用脚本依次读取网页的信息。个人觉得,如果是用perl/python等来读取的话,.txt
格式比较适合;而如果是用R来读取的话,.xml
相对来说更加适合,有XML包
(PS.perl/python也有适合处理xml格式的模块)
由于有需求必须要用R来抓取网页信息,则必须了解下如何使用XML
包,这个包被很多R包所引用,但网上对于这个包的实例使用介绍的较少,所以最终还是需要看这R包的文档说明,我就尝试着跟着文档例子略微学习了下,解决下我的需求。。。
针对P12345.xml
,则先加载XML包
,然后用xmlParse
读入文件(或者用xmlTreeParse
读入文件,其更适合R的一些统计函数操作)
library(XML)
result <- xmlParse(file = "P12345.xml")
比如我想知道P12345.xml
文件的Proetein ID是哪个(虽然看文件名就知道是P12345...),按照网上教程应该是如下。getNodeSet是属于XPath表达式函数,因为Protein ID是标记accession的文本内容,并且accession标记是在uniprot和entry标记内部
k <- getNodeSet(result, "/uniprot/entry/accession")
或者不用/
而用//
作为标记路径(理解为相对路径,即直接读取文档中accession标记下的内容,不管其在哪个其他标记下)
k <- getNodeSet(result, "//accession")
k
#[[1]]
#<accession>P12345</accession>
#[[2]]
#<accession>G1SKL2</accession>
#attr(,"class")
#[1] "XMLNodeSet"
这样的结果还是不够直接,如何想直接显示P12345这个ID,则需要再加上xmlValue
函数,用于直接提取文本
k <- getNodeSet(result2, "//accession", fun = xmlValue)
k
#[[1]]
#[1] "P12345"
#[[2]]
#[1] "G1SKL2"
由于上述方式输出的是以List格式输出的,还需要unlist
函数转化为向量,不是太方便,所以有了xpathSApply
函数,功能是跟getNodeSet
函数大体上相同,但sapply输出更加整洁,输出是向量
k <- xpathSApply(result2, "//accession", fun = xmlValue)
k
#[1] "P12345" "G1SKL2"
注:但是!!!针对Uniprot真实的xml文件,其由于有一个<uniprot xmlns="http://uniprot.org/uniprot" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://uniprot.org/uniprot http://www.uniprot.org/support/docs/uniprot.xsd">
这个标签的问题,导致上述提取信息的方式是无效的!!!必须要加上namespaces参数才行(这个值随便填个不重复的就行),我也没明白这个标签为啥会导致这个问题(但是只要去除uniprot标签属性名后面的内容,即改为<uniprot>
又有效了,所以猜想是这个标签的问题)
c <- xpathSApply(result, "//c:accession", fun = xmlValue, namespaces = "c")
c
#[1] "P12345" "G1SKL2"
比如我还想知道这个P12345蛋白所对应的GO信息,文件中格式如下:
<dbReference type="GO" id="GO:0006532">
<property type="term" value="P:aspartate biosynthetic process"/>
<property type="evidence" value="ECO:0000501"/>
<property type="project" value="Ensembl"/>
</dbReference>
以提取GO ID为例,方括号内对属性名进行定位,“@”后接属性值,而且是用xmlGetAttr
用于提取id属性的属性值
g <- xpathSApply(result, "//g:dbReference[@type='GO']", xmlGetAttr, "id", namespaces = "g")
如果换成提取GO Term,则如下所示,输出的均是向量
h <- xpathSApply(result, "//h:dbReference/h:property[@type='term']", xmlGetAttr, "value", namespaces = "h")
如果没有对应的属性名,则返回空列表list()
其他信息可照这种形式提取,至于网页爬虫则需要依情况而定了,还是得再看看https://cran.r-project.org/web/packages/XML/XML.pdf
本文出自于http://www.bioinfo-scrounger.com转载请注明出处