首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有R- XML问题的zillow api

带有R- XML问题的zillow api
EN

Stack Overflow用户
提问于 2016-08-07 18:18:53
回答 3查看 2.2K关注 0票数 4

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

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

你能告诉我该怎么处理这个吗?

代码语言:javascript
复制
#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)

这会引发以下错误:

代码语言:javascript
复制
Error: XML content does not seem to be XML

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-07 20:33:55

这是一个有趣的机会,让我熟悉Zillow API。按照How to parse XML to R data frame,我的方法是将响应转换为列表,以便于检查。繁重的比特通过检查列表来确定数据的结构,特别是因为每个属性都可能有一些丢失的数据。这就是为什么我编写getValRange函数来处理解析Z估测数据的原因。

代码语言:javascript
复制
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)))

样本输出:

代码语言:javascript
复制
> 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
票数 4
EN

Stack Overflow用户

发布于 2016-08-07 19:09:31

代码语言:javascript
复制
# 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“东7街120号”"10009“”请求成功处理了"0“响应”结果“结果”"zpid“文本"2131798322”链接.- attr(*,“Named”)= chr 1:653 "request.address“"request.citystatezip”"message.text“"message.code”.

代码语言:javascript
复制
dat <- as.data.frame(dat)
dat <- gsub("text","", dat$dat)

我不太清楚你想对这些结果做些什么,但它们确实存在,而且看起来很好:

代码语言:javascript
复制
head(dat, 20)

1“东7街120号”2 "10009“3”成功处理“4 "0“5”答复“6”结果“7“结果”8 "zpid“9 "”10个"2131798322“11”链接“12“家庭细节”13“14 "zpid/”15 "“地图”16“17 "zpid/”18“可比较”19“20”zpid/

票数 2
EN

Stack Overflow用户

发布于 2018-02-23 22:26:19

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

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

假设您感兴趣的属性的Zillow ID为36086728,代码将如下所示。

代码语言:javascript
复制
home_estimate("36086728")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38817153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档