【问题标题】:zillow api with R - XML issue带有 R 的 zillow api - XML 问题
【发布时间】:2016-08-07 18:18:53
【问题描述】:

我正在尝试从 Zillow API 读取信息,并且在 R 中遇到了一些数据结构问题。我的输出应该是 xml 并且看起来是,但行为不像 xml。

具体来说,GetSearchResults() 返回给我的对象是一种类似于 XML 的格式,但在 R 的 XML 读取函数中读取不太正确。

你能告诉我应该如何处理这个问题吗?

#set directory
setwd('[YOUR DIRECTORY]')

# setup libraries
library(dplyr)
library(XML)
library(ZillowR)
library(RCurl)

# setup api key
set_zillow_web_service_id('[YOUR API KEY]')

xml = GetSearchResults(address = '120 East 7th Street', citystatezip = '10009')
data = xmlParse(xml)

这会引发以下错误:

Error: XML content does not seem to be XML

Zillow API 文档明确指出输出应该是 XML,而且看起来确实如此。我希望能够轻松访问 API 输出的各种组件,以进行更大规模的数据操作/聚合。如果您有任何想法,请告诉我。

【问题讨论】:

  • 那么,xml 的值是什么样的?它看起来像 XML 吗? GetSearchResults() 函数是否已经为您解析了 XML?
  • GetSearchResults() 它返回“一个命名列表...”。 XML 已被解析,您的搜索结果位于 response 列表元素中,该元素是 “具有 API 特定响应值的 XMLNode。”.

标签: r xml zillow


【解决方案1】:

这对我来说是一个熟悉 Zillow API 的有趣机会。我遵循How to parse XML to R data frame 的方法是将响应转换为列表,以便于检查。繁重的一点是通过检查列表来弄清楚数据的结构,特别是因为每个属性都可能有一些丢失的数据。这就是我编写getValRange 函数来处理解析Zestimate 数据的原因。

results <- xmlToList(xml$response[["results"]])

getValRange <- function(x, hilo) {
  ifelse(hilo %in% unlist(dimnames(x)), x["text",hilo][[1]], NA)
}

out <- apply(results, MAR=2, function(property) {
  zpid <- property$zpid
  links <- unlist(property$links)
  address <- unlist(property$address)
  z <- property$zestimate
  zestdf <- list(
    amount=ifelse("text" %in% names(z$amount), z$amount$text, NA),
    lastupdated=z$"last-updated",
    valueChange=ifelse(length(z$valueChange)==0, NA, z$valueChange),
    valueLow=getValRange(z$valuationRange, "low"),
    valueHigh=getValRange(z$valuationRange, "high"),
    percentile=z$percentile)  
  list(id=zpid, links, address, zestdf)
})

data <- as.data.frame(do.call(rbind, lapply(out, unlist)), 
  row.names=seq_len(length(out)))

样本输出:

> data[,c("id", "street", "zipcode", "amount")]
          id              street zipcode  amount
1 2098001736 120 E 7th St APT 5A   10009 2321224
2 2101731413 120 E 7th St APT 1B   10009 2548390
3 2131798322 120 E 7th St APT 5B   10009 2408860
4 2126480070 120 E 7th St APT 1A   10009 2643454
5 2125360245 120 E 7th St APT 2A   10009 1257602
6 2118428451 120 E 7th St APT 4A   10009    <NA>
7 2125491284 120 E 7th St FRNT 1   10009    <NA>
8 2126626856 120 E 7th St APT 2B   10009 2520587
9 2131542942 120 E 7th St APT 4B   10009 1257676

【讨论】:

  • 这是一个很好的答案。谢谢!
  • 我用 GetUpdatedPropertyDetails 试过这个,它有帮助,但它创建的列表有多个同名的元素(例如 results$images$image$url)。我不确定如何处理它,因为它只使用 results$images$image$url[1] 返回第一个,而使用 x$images$image$url[2] 返回第一个。
  • cc
【解决方案2】:
# setup libraries
pacman::p_load(dplyr,XML,ZillowR,RCurl) # I use pacman, you don't have to

# setup api key
set_zillow_web_service_id('X1-mykey_31kck')

xml <- GetSearchResults(address = '120 East 7th Street', citystatezip = '10009')
dat <- unlist(xml)
str(dat)

已命名 chr [1:653] "120 East 7th Street" "10009" "请求成功 已处理”“0”“响应”“结果”“结果”“zpid”“文本” “2131798322” “链接” ... - attr(*, "names")= chr [1:653] "request.address" "request.citystatezip" "message.text" "message.code" ...

dat <- as.data.frame(dat)
dat <- gsub("text","", dat$dat)

我不确定你想对这些结果做什么,但它们就在那里,而且看起来不错:

head(dat, 20)
 [1] "120 East 7th Street"                                                                     
 [2] "10009"                                                                                   
 [3] "Request successfully processed"                                                          
 [4] "0"                                                                                       
 [5] "response"                                                                                
 [6] "results"                                                                                 
 [7] "result"                                                                                  
 [8] "zpid"                                                                                    
 [9] ""                                                                                        
[10] "2131798322"                                                                              
[11] "links"                                                                                   
[12] "homedetails"                                                                             
[13] ""                                                                                        
[14] "http://www.zillow.com/homedetails/120-E-7th-St-APT-5B-New-York-NY-10009/2131798322_zpid/"
[15] "mapthishome"                                                                             
[16] ""                                                                                        
[17] "http://www.zillow.com/homes/2131798322_zpid/"                                            
[18] "comparables"                                                                             
[19] ""                                                                                        
[20] "http://www.zillow.com/homes/comps/2131798322_zpid/"

【讨论】:

    【解决方案3】:

    如前所述,诀窍是将 API 放入列表中(与 XML 相对)。然后,提取您感兴趣的任何数据变得非常简单。

    我写了一个 R 包来简化这个。看看 github - https://github.com/billzichos/homer。它带有一个小插图。

    假设您感兴趣的房产的 Zillow ID 是 36086728,代码如下所示。

    home_estimate("36086728")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      相关资源
      最近更新 更多