Получить XML 1.1 от Api с помощью R

http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=9788426379696&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4

http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=9788426348593&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4

Я пытаюсь получить описание из этого 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))
        }
     }
Другие вопросы по тегам