用XML包解析uniprot的API网页

如果想从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转载请注明出处