Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在R_Xml_R_Web Scraping_Rcurl - Fatal编程技术网

Xml 在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

尽管Chemspider SSOAP Web API允许检索给定化合物的化学结构,但不允许检索实验测量的物理化学性质,如沸点和列出的同义词

如果你往里看 它在Properties下提供了一个同义词和实验数据列表(您可能需要先注册才能看到这些信息),我想在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">

最优雅的方法是什么,例如使用
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"