Xml 在R
尽管Chemspider SSOAP Web API允许检索给定化合物的化学结构,但不允许检索实验测量的物理化学性质,如沸点和列出的同义词 如果你往里看 它在Properties下提供了一个同义词和实验数据列表(您可能需要先注册才能看到这些信息),我想在R中检索这些信息 我做了一些事情Xml 在R,xml,r,web-scraping,rcurl,Xml,R,Web Scraping,Rcurl,尽管Chemspider SSOAP Web API允许检索给定化合物的化学结构,但不允许检索实验测量的物理化学性质,如沸点和列出的同义词 如果你往里看 它在Properties下提供了一个同义词和实验数据列表(您可能需要先注册才能看到这些信息),我想在R中检索这些信息 我做了一些事情 library(httr) library(XML) csid="733" # chemspider ID of glycerin url=paste("http://www.chemspider.com/Che
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">
最优雅的方法是什么,例如使用xpathsaply
(与简单的strsplit
/gsub
作业相反)
干杯,
汤姆刮网总是让人忧心忡忡。首先,您不能保证提供者在将来某个时候不会更改其格式。另一方面,当前的格式根本不是标准化的。避免这种情况是SOAP和XMLWeb服务的全部要点 话虽如此,这应该让你开始:
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)
最后,同义词标签是一个真正的噩梦。有一组基本的同义词,还有一个“更多…”链接,它公开了一组额外的(更模糊的)同义词。代码只获取基线集
#同义词选项卡
synNodes与解析ChemSpider网页相比,使用REST API更好、更容易:
所以,为了得到同义词列表,ID为733的化合物的预测和实验性质都要这样做
非常感谢-这将是我开始工作的一个很好的开始-非常感谢!!是的,我知道,网络抓取并不理想,但由于许可限制,他们不提供用于检索此信息的SOAP web服务(为了获取InChIs等,SOAP界面工作得很好)。向“同义词”选项卡一节提问:有没有办法不仅获取基线集,而且获取所有显示为“更多…”的同义词?谢谢-据我所知,由于许可限制,ACDLabs计算属性无法以这种方式提供,这迫使我走上网络抓取路线…为了回答您的问题,您始终可以将从网页中提取的内容与输出进行比较:)
# 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
# parse acdLabsTab
acdLabsTab <- getNodeSet(doc,'//div[@id="acdLabsTab"]/div/div')[[1]]
acdLabs <- readHTMLTable(acdLabsTab)
# 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"