Получить XML 1.1 от Api с помощью R
Я пытаюсь получить описание из этого XML с использованием R, но мне трудно это сделать.
Поскольку не все XML имеют все свои параметры, я не могу "связать" позицию описания не только потому, что не может быть описания, но и потому, что отсутствие другого параметра может изменить индекс описания.
Мне нужен способ "поиска" для этого XML, который имеет описание слова в своих атрибутах.
require(stringr)
library("rjson")
require(XML)
cat("\014")
gc()
isbn <- 9788426379696
key <- 'd231aa37c9b4f5d304a60a3d0ad1dad4'
descripcion_librarything <- function( isbn_num ,APIKey ){
url <- "http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn="
url<- paste(url,isbn_num, "&apikey=", APIKey, sep = "")
data <- xmlParse(url)
xml_data <- xmlToList(data)
class(xml_data)
#<field type="14" name="description" displayName="Description">
xml_data$ltml$item$author$text
xml_data$ltml$item$commonknowledge$fieldList[17]$field$versionList$version$factList$fact
doc = xmlInternalTreeParse(url)
hasSentence = xpathApply(doc, "description")
xpathApply(doc, "description")
doc = xmlTreeParse(url)
xmlAttrs(xmlRoot(doc)[[1]][[1]][[5]][[1]][[17]])
str <- null
return(str)
}
descripcion_librarything (isbn, key)
заранее спасибо!
2 ответа
library(httr)
library(xml2)
get_description <- function(ISBN) {
httr::GET("http://www.librarything.com/services/rest/1.1/",
query=list(method = "librarything.ck.getwork",
isbn = ISBN,
apikey = Sys.getenv("LIBRARYTHING_API_KEY"))) -> res
stop_for_status(res)
res <- content(res, as="text")
doc <- read_xml(res)
desc <- xml_find_all(doc, ".//*[@name='description']")
if (length(desc) > 0) {
xml_text(desc) # or whatever you need
} else {
"" # or whatever you want to return if not found
}
}
isbns <- c("9788426379696", "9788426348593")
purrr::map_chr(isbns, get_description)
Тот:
- делает это упакованным API
- не допускает использования ключа API в сценариях и сообщениях Stackru (УДАЛИТЬ И ОБНОВИТЬ КЛЮЧ)
- предоставляет способ нацеливать и обрабатывать описания и возвращать то, что вам нужно
- предоставляет способ вернуть что-то полезное при не найденном условии
Циклически просматривайте данные xml<- xmlToList (data), например:
for (i in 1:length(xml_data$ltml$item$commonknowledge$fieldList) ){
if(xml_data$ltml$item$commonknowledge$fieldList[i]$field$.attrs['name'] == "description" ){
print(paste('index ',i))
}
}