虽然Chemspider SSOAP Web API允许人们检索给定化合物的化学结构,但它不允许人们检索实验测量的物理化学特性,如沸点和列出的同义词。
E.g。如果你看看 http://www.chemspider.com/Chemical-Structure.733.html 它给出了属性下的同义词和实验数据列表(你可能必须先注册才能看到这个信息),我想在R中检索它。
我做了一些事情
library(httr)
library(XML)
csid="733" # chemspider ID of glycerin
url=paste("http://www.chemspider.com/Chemical-Structure.",csid,".html",sep="")
webp=GET(url)
doc=htmlParse(webp,encoding="UTF-8")
但是我想在
之后检索和解析具有化学特性的部分<div class="tab-content" id="epiTab"> and
<div class="tab-content" id="acdLabsTab">
并获取每个部分后给出的所有同义词
<p class="syn" xmlns:cs="http://www.chemspider.com" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
这样做最优雅的方式是什么,例如:使用xpathSApply
(而不是简单的strsplit
/ gsub
工作)?
欢呼声, 汤姆
答案 0 :(得分:1)
网络抓取总是令人担忧。首先,您无法保证提供商在将来的某个时刻不会更改其格式。另一方面,目前的格式不是标准化的。避免这种情况是SOAP和XML Web服务的重点。
说了这么多,这应该让你开始:
library(XML)
# load and parse the document
csid <- "733" # chemspider ID of glycerin
url <- paste0("http://www.chemspider.com/Chemical-Structure.",csid,".html")
doc <- htmlTreeParse(url,useInternal=T)
epi选项卡中的数据实际上位于文本块中(例如<pre>...</pre>
),因此我们使用XPath做的最好的事情就是获取该文本。从那里你仍然需要某种正则表达式解决方案来解析参数。以下示例涉及MP,BP和VP。
# parse epiTab
epiTab <- xmlValue(getNodeSet(doc,'//div[@id="epiTab"]/pre')[[1]])
epiTab <- unlist(strsplit(epiTab,"\n"))
params <- c(MP="Melting Pt (deg C):",
BP="Boiling Pt (deg C):",
VP="VP(mm Hg,25 deg C):")
prop <- sapply(params,function(x){
z <- epiTab[grep(x,epiTab,fixed=T)]
r <- unlist(regexpr(": \\d+\\.*\\d+E*\\+*\\-*\\d*",z))
return(as.numeric(substr(z,r+3,r+attr(r,"match.length")-1)))
})
prop
# MP BP VP
# 1.9440e+01 2.3065e+02 7.9800e-05
acdLabs选项卡中的数据实际上位于HTML表格中,因此我们可以导航到相应的节点并使用readHTMLTable(...)
将其放入数据框中。数据框仍然需要一些调整。
# parse acdLabsTab
acdLabsTab <- getNodeSet(doc,'//div[@id="acdLabsTab"]/div/div')[[1]]
acdLabs <- readHTMLTable(acdLabsTab)
最后,同义词标签是一个真正的噩梦。有一组基本的同义词,还有一个“更多...”链接,它暴露了一个额外的(更加模糊的)集合。代码bbelow只是抓住基线集。
# synonyms tab
synNodes <- getNodeSet(doc,'//div[@id="synonymsTab"]/div/div/div/p[@class="syn"]')
synonyms <- sapply(synNodes,function(x)xmlValue(getNodeSet(x,"./strong")[[1]]))
synonyms
# [1] "1,2,3-Propanetriol" "Bulbold" "Cristal" "Glicerol" "Glyceol" "Glycerin" "Glycerin"
# [8] "glycerine" "glycerol" "Glycérol"
答案 1 :(得分:0)
而不是解析ChemSpider网页,它更好,更容易使用REST API:http://parts.chemspider.com/JSON.ashx
因此,为了获得同义词列表,ID为733的化合物的预测和实验属性可以做到这一点 http://parts.chemspider.com/JSON.ashx?op=GetRecordsAsCompounds&csids[0]=733&serfilter=Compound[PredictedProperties|ExperimentalProperties|Synonyms]