zillow api 与 R - XML 问题
zillow api with R - XML issue
我正在尝试从 Zillow API 中读取信息并 运行 进入 R 中的一些数据结构问题。我的输出应该是 xml 并且看起来是,但表现不像 xml。
具体来说,GetSearchResults() returns 对我来说的格式类似于 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 输出的各种组件以进行更大规模的数据操作/聚合。如果您有任何想法,请告诉我。
# 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)
Named chr [1:653] "120 East 7th Street" "10009" "Request successfully
processed" "0" "response" "results" "result" "zpid" "text"
"2131798322" "links" ...
- 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/"
这对我来说是一个有趣的机会来熟悉 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
如前所述,诀窍是将 API 放入列表(而不是 XML)。然后提取您感兴趣的任何数据变得非常简单。
我写了一个 R 包来简化这个。看看 github - https://github.com/billzichos/homer。它带有一个小插图。
假设您感兴趣的 属性 的 Zillow ID 是 36086728,代码如下所示。
home_estimate("36086728")
我正在尝试从 Zillow API 中读取信息并 运行 进入 R 中的一些数据结构问题。我的输出应该是 xml 并且看起来是,但表现不像 xml。
具体来说,GetSearchResults() returns 对我来说的格式类似于 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 输出的各种组件以进行更大规模的数据操作/聚合。如果您有任何想法,请告诉我。
# 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)
Named chr [1:653] "120 East 7th Street" "10009" "Request successfully processed" "0" "response" "results" "result" "zpid" "text" "2131798322" "links" ... - 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/"
这对我来说是一个有趣的机会来熟悉 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
如前所述,诀窍是将 API 放入列表(而不是 XML)。然后提取您感兴趣的任何数据变得非常简单。
我写了一个 R 包来简化这个。看看 github - https://github.com/billzichos/homer。它带有一个小插图。
假设您感兴趣的 属性 的 Zillow ID 是 36086728,代码如下所示。
home_estimate("36086728")