0

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

我正在尝试使用 R 从该 XML 中获取描述,但我很难做到这一点。

由于并非所有 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)

提前致谢 !

4

2 回答 2

1
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 密钥保留在脚本和 StackOverflow 帖子之外(删除和无效密钥)
  • 提供一种方法来定位和处理描述并返回您需要的内容
  • 提供了一种在未找到的情况下返回有用的东西的方法
于 2017-05-19T11:44:27.610 回答
0

遍历 xml data<- 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))
        }
     }
于 2017-05-19T10:10:20.413 回答