从瑞典统计局下载数据。查询中的瑞典语字符
Download data from Statistics Sweden. Swedish characters in query
我已经设法使用网站 api 从瑞典统计局检索了一些数据。
这个问题的答案解决了我的大部分问题。
How do I POST a JSON formatted request to GET JSON data from a URL in R into the data.frame in a less verbose manner?
但是我还有两个问题。
如果我的 json 问题中有带变音符号的字符(例如“Å”、“Ä”、“Ö”),我会从服务器收到“404”响应。
我正在尝试从此 table:
下载数据
Population 16+ years (RAMS) by region, employment, age and sex. Year 2004 - 2015
(如果您点击“继续”然后点击“api for this table”,您可以在网站上查询到api,但您必须更改从 "px" 到 "json" 的响应格式。)
此代码有效:
library(jsonlite)
library(httr)
bodytxt <- '{
"query": [
{
"code": "Region",
"selection": {
"filter": "vs:RegionKommun07",
"values": [
"0114",
"1280"
]
}
},
{
"code": "Alder",
"selection": {
"filter": "item",
"values": [
"16-19"
]
}
},
{
"code": "Tid",
"selection": {
"filter": "item",
"values": [
"2015"
]
}
}
],
"response": {
"format": "json"
}
}'
req <- POST("http://api.scb.se/OV0104/v1/doris/en/ssd/START/AM/AM0207/AM0207H/BefSyssAldKonK",
body = bodytxt, encode = "json")
stop_for_status(req)
json <- content(req, "text")
# JSON starts with an invalid character:
validate(json)
json <- substring(json, 2)
validate(json)
# Now we can parse
object <- fromJSON(json)
print(object)
但是如果我更改查询使其包含“Ö”,它就不起作用。示例:
bodytxt <- '{
"query": [
{
"code": "Region",
"selection": {
"filter": "vs:RegionKommun07",
"values": [
"0114",
"1280"
]
}
},
{
"code": "Sysselsattning",
"selection": {
"filter": "item",
"values": [
"FÖRV"
]
}
},
{
"code": "Alder",
"selection": {
"filter": "item",
"values": [
"16-19"
]
}
},
{
"code": "Tid",
"selection": {
"filter": "item",
"values": [
"2015"
]
}
}
],
"response": {
"format": "json"
}
}'
我遇到的另一个问题是,据我所知,应该可以将 json 查询更改为列表并将该列表包含在对服务器的调用中,但我得到了“404”——错误。示例:
body_list <- fromJSON(bodytxt)
req <- POST("http://api.scb.se/OV0104/v1/doris/en/ssd/START/AM/AM0207/AM0207H/BefSyssAldKonK",
body = body_list, encode = "json")
我做错了什么?
Ps!我知道 CRAN 上有一个名为 pxweb 的优秀软件包,非常易于使用,可以从瑞典统计局下载数据。但是我想学习 api 并且 pxwed 不允许我在查询中跳过维度。
系统:Windows7、r脚本以utf-8编码保存。
为 fromJSON()
尝试这些参数:
library(httr)
library(jsonlite)
您的数据:
bodytxt <- '{
"query": [
{
"code": "Region",
"selection": {
"filter": "vs:RegionKommun07",
"values": [
"0114",
"1280"
]
}
},
{
"code": "Sysselsattning",
"selection": {
"filter": "item",
"values": [
"FÖRV"
]
}
},
{
"code": "Alder",
"selection": {
"filter": "item",
"values": [
"16-19"
]
}
},
{
"code": "Tid",
"selection": {
"filter": "item",
"values": [
"2015"
]
}
}
],
"response": {
"format": "json"
}
}'
修改后的fromJSON()
转换:
query <- jsonlite::fromJSON(bodytxt,
simplifyVector=FALSE,
simplifyDataFrame=FALSE)
你打了同样的电话(为了我的利益添加了 verbose()
,但你可以删除它):
URL <- "http://api.scb.se/OV0104/v1/doris/en/ssd/START/AM/AM0207/AM0207H/BefSyssAldKonK"
req <- POST(URL, body=query, encode="json", verbose())
结果:
content(req, simplifyDataFrame=TRUE)
## Warning: JSON string contains (illegal) UTF8 byte-order-mark!
## $columns
## code text type
## 1 Region region d
## 2 Sysselsattning employment status d
## 3 Alder age d
## 4 Tid year t
## 5 AM0207F2 Population 16+ years (RAMS) c
##
## $comments
## list()
##
## $data
## key values
## 1 0114, FÖRV, 16-19, 2015 379
## 2 1280, FÖRV, 16-19, 2015 1443
警告是由于 API 服务器正在将字节顺序标记与结果一起发回(它是 Microsoft 服务器,所以他们在处理这个问题时有点脑残)。 jsonlite
(content()
中进行转换的位)可以处理它。
我已经设法使用网站 api 从瑞典统计局检索了一些数据。 这个问题的答案解决了我的大部分问题。
How do I POST a JSON formatted request to GET JSON data from a URL in R into the data.frame in a less verbose manner?
但是我还有两个问题。
如果我的 json 问题中有带变音符号的字符(例如“Å”、“Ä”、“Ö”),我会从服务器收到“404”响应。
我正在尝试从此 table:
下载数据Population 16+ years (RAMS) by region, employment, age and sex. Year 2004 - 2015
(如果您点击“继续”然后点击“api for this table”,您可以在网站上查询到api,但您必须更改从 "px" 到 "json" 的响应格式。)
此代码有效:
library(jsonlite)
library(httr)
bodytxt <- '{
"query": [
{
"code": "Region",
"selection": {
"filter": "vs:RegionKommun07",
"values": [
"0114",
"1280"
]
}
},
{
"code": "Alder",
"selection": {
"filter": "item",
"values": [
"16-19"
]
}
},
{
"code": "Tid",
"selection": {
"filter": "item",
"values": [
"2015"
]
}
}
],
"response": {
"format": "json"
}
}'
req <- POST("http://api.scb.se/OV0104/v1/doris/en/ssd/START/AM/AM0207/AM0207H/BefSyssAldKonK",
body = bodytxt, encode = "json")
stop_for_status(req)
json <- content(req, "text")
# JSON starts with an invalid character:
validate(json)
json <- substring(json, 2)
validate(json)
# Now we can parse
object <- fromJSON(json)
print(object)
但是如果我更改查询使其包含“Ö”,它就不起作用。示例:
bodytxt <- '{
"query": [
{
"code": "Region",
"selection": {
"filter": "vs:RegionKommun07",
"values": [
"0114",
"1280"
]
}
},
{
"code": "Sysselsattning",
"selection": {
"filter": "item",
"values": [
"FÖRV"
]
}
},
{
"code": "Alder",
"selection": {
"filter": "item",
"values": [
"16-19"
]
}
},
{
"code": "Tid",
"selection": {
"filter": "item",
"values": [
"2015"
]
}
}
],
"response": {
"format": "json"
}
}'
我遇到的另一个问题是,据我所知,应该可以将 json 查询更改为列表并将该列表包含在对服务器的调用中,但我得到了“404”——错误。示例:
body_list <- fromJSON(bodytxt)
req <- POST("http://api.scb.se/OV0104/v1/doris/en/ssd/START/AM/AM0207/AM0207H/BefSyssAldKonK",
body = body_list, encode = "json")
我做错了什么?
Ps!我知道 CRAN 上有一个名为 pxweb 的优秀软件包,非常易于使用,可以从瑞典统计局下载数据。但是我想学习 api 并且 pxwed 不允许我在查询中跳过维度。
系统:Windows7、r脚本以utf-8编码保存。
为 fromJSON()
尝试这些参数:
library(httr)
library(jsonlite)
您的数据:
bodytxt <- '{
"query": [
{
"code": "Region",
"selection": {
"filter": "vs:RegionKommun07",
"values": [
"0114",
"1280"
]
}
},
{
"code": "Sysselsattning",
"selection": {
"filter": "item",
"values": [
"FÖRV"
]
}
},
{
"code": "Alder",
"selection": {
"filter": "item",
"values": [
"16-19"
]
}
},
{
"code": "Tid",
"selection": {
"filter": "item",
"values": [
"2015"
]
}
}
],
"response": {
"format": "json"
}
}'
修改后的fromJSON()
转换:
query <- jsonlite::fromJSON(bodytxt,
simplifyVector=FALSE,
simplifyDataFrame=FALSE)
你打了同样的电话(为了我的利益添加了 verbose()
,但你可以删除它):
URL <- "http://api.scb.se/OV0104/v1/doris/en/ssd/START/AM/AM0207/AM0207H/BefSyssAldKonK"
req <- POST(URL, body=query, encode="json", verbose())
结果:
content(req, simplifyDataFrame=TRUE)
## Warning: JSON string contains (illegal) UTF8 byte-order-mark!
## $columns
## code text type
## 1 Region region d
## 2 Sysselsattning employment status d
## 3 Alder age d
## 4 Tid year t
## 5 AM0207F2 Population 16+ years (RAMS) c
##
## $comments
## list()
##
## $data
## key values
## 1 0114, FÖRV, 16-19, 2015 379
## 2 1280, FÖRV, 16-19, 2015 1443
警告是由于 API 服务器正在将字节顺序标记与结果一起发回(它是 Microsoft 服务器,所以他们在处理这个问题时有点脑残)。 jsonlite
(content()
中进行转换的位)可以处理它。