2014-02-11 3 views
2

Хотя веб-API SSOAP Chemspider позволяет извлекать химическую структуру данных соединений, он не позволяет извлекать экспериментально измеренные физико-химические свойства, такие как точки кипения и перечисленные синонимы.Скребковые экспериментально измеренные физико-химические свойства и синонимы из Chemspider в R

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/)?

веселит, Том

ответ

1

Веб соскоб всегда чревата. Во-первых, у вас нет гарантии, что поставщик не изменит свое форматирование в какой-то момент в будущем. В другом случае текущие форматы не являются стандартизированными. Избегая этого, весь смысл веб-сервисов SOAP и XML.

Сказав все это, это поможет вам начать:

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) 

Данные на вкладке эпи фактически в текстовом блоке (например <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(...) положить, что в dataframe. Однако кадр данных нуждается в некоторой настройке.

# 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"  
+0

Большое спасибо за это - это будет очень хорошее начало для меня, чтобы пройтись! THX много! И да, я знаю, веб-скребок не идеален, но из-за ограничений лицензирования они не предлагают веб-сервисы SOAP для извлечения этой информации (для получения InChI и т. Д. Интерфейс SOAP отлично работает). –

+0

Вопрос к разделу # synonyms tab: есть ли способ не просто захватить базовый набор, но получить все синонимы, которые появляются с помощью «больше ...»? – user2030503

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]

+0

Спасибо за это - как я понимаю, вычисляемые свойства ACDLabs недоступны таким образом, хотя из-за лицензионных ограничений, что заставило меня спуститься по веб-методу ... –

+0

, чтобы ответить на ваш вопрос, вы всегда можете сравнить что вы извлекли из веб-страницы с результатом http://parts.chemspider.com/JSON.ashx?op=GetRecordsAsCompounds&csids[0]=733&serfilter=Compound[PredictedProperties] :) –