r - 从瑞典统计局下载数据。查询中的瑞典语字符

标签 r httr

我已成功使用网站 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”响应。

我正在尝试从此表下载数据:

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 不允许我跳过查询中的维度。

系统:Windows 7,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() 中进行转换的位)可以处理它。

关于r - 从瑞典统计局下载数据。查询中的瑞典语字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42340147/

相关文章:

r - 在 R 中运行 httr 库和相互身份验证时 SSL 握手失败

javascript - 动态表的网络抓取

r - 在 R 中的 data.table 中创建复合/交互虚拟变量

r - 如何过滤列中包含少于 3 个空格的行? (右)

r - httr 和 Accept-Encoding : gzip, deflate

r - 使用 R 从网页中提取元描述

使用 dropbox api 读取 R 中的原始数据以保存为 .RData 文件

r - 将表示天数的时间小数/分数转换为 R 中的实际时间?

r - 错误栏和值标签没有放置在 ggplot2 中的正确栏上

r - 如何定义一个函数,它接受括号外的参数,如 names()