刮擦实验测量物理化学性质和来自Chemspider的同义词

时间:2014-02-11 21:21:27

标签: xml r web-scraping rcurl

虽然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工作)?

欢呼声, 汤姆

2 个答案:

答案 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]