首页 > 解决方案 > 如何通过使用带有 r 或 python 的 json 将 HTML 转换为数据框?

问题描述

我正在创建一个map,它的数据似乎html在这个网络链接上可用:https ://jsfiddle.net/BlackLabel/jaL7q5x3/2/

(我不是真正的程序员,所以不确定那是html 还是 java 或 json但它说html所以把它当作html但它看起来java/json对我来说)

因为我无法将其直接用于r libraryhighcharts hcmap()中的函数。因此,我尝试将其复制并粘贴到文件中,并尝试将其作为对象读取,以便将其转换为对象,但失败了。html.txtpythonjsondataframe

with open('E:/3. R/Covid19/path.txt') as f:
    json_data = json.load(f)

JSONDecodeError:预期值:第 48 行第 23 列(字符 56995)

有没有办法可以读取并将其转换为可以进一步用于创建的数据框map

我对r & python解决方案都持开放态度,可以将其转换为可以转换为 dataframe的对象。

网站上的一小部分代码:

Highcharts.maps["countries/in/custom/in-all-disputed"] = {"title":"有争议领土的印度","version":"1.1.3","type":"FeatureCollection"," copyright":"Copyright (c) 2020 Highsoft AS, 基于 http://projects.datameet.org/maps/states/","copyrightShort":"projects.datameet.org","copyrightUrl":"https:// /creativecommons.org/licenses/by/2.5/in/","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG:32644" }},"hc-transform":{"default":{"crs":"+proj=utm +zone=44 +datum=WGS84 +units=m +no_defs","scale":0.00020862025385,"jsonres":15.5,"jsonmarginX":-999,"jsonmarginY":9851,"xoffset":-814534.248882,"yoffset ":4122045.33412}},"features":[{"type":"Feature","id":"Madhya Pradesh","properties":{"hc-group":"admin1","hc-key": “中央邦”,“hc-a2”:“MP”,“名称”:“中央邦”,“hc-middle-x”:0.5,“hc-middle-y”:0.5},“几何”:{ "type":"MultiPolygon","coordinates":[[[[977,4582],[974,4582],[971,4589],[976,4590],[977,4582]]],[[[ 3557,4938],[3575,4908],[3575,4899],[3575,4899],[3575,4898],[3576,4897],[3578,4895],[3579,4896],[3580, 4897],[3580,4898],[3583,4896],[3584,4895],[3646,4865],[3624,4785],[3565,4775],[3566,4732],[3509,4702],[3515,4664],[3509,4657] ,[3467,4607],[3411,4565],[3386,4547],[3361,4576],[3317,4562]

我与此相关的原始 SO 帖子仍未得到答复:

如何从网站而不是 hcmap() 获取 r highchart 地图数据?

如何在 highcharts 中获得正确的印度地图?

标签: pythonhtmlrjson

解决方案


您要提取的数据是 JSON 数据。然而,它不是完全有效的 JSON。你得稍微清理一下。您可以使用jsonlint.com等网站来验证 JSON 数据。

JSON数据的问题是(1)一开始,您需要删除“Highcharts.maps[“countries/in/custom/in-all-disputed”] = 直到第一个花括号的部分{;(2) 三行有一个“注释”,两个斜杠后跟四个数字,例如“// 0000”。这些需要在摄取 JSON 数据之前删除(我看到两次“// 8440”和一次“// 1227”)。

完成此操作后,您可以从包中的 txt 文件中提取R数据jsonlite

library(jsonlite)
library(tibble)
a <- fromJSON("path.txt")
as_tibble(a$features)
#> # A tibble: 37 x 4
#>    type   id       properties$`hc-g… $`hc-key`   $`hc-a2` $name   $`hc-middle-x`
#>    <chr>  <chr>    <chr>             <chr>       <chr>    <chr>            <dbl>
#>  1 Featu… Madhya … admin1            madhya pra… MP       Madhya…           0.5 
#>  2 Featu… Uttar P… admin1            uttar prad… UP       Uttar …           0.5 
#>  3 Featu… Karnata… admin1            karnataka   KA       Karnat…           0.35
#>  4 Featu… Nagaland admin1            nagaland    NA       Nagala…           0.5 
#>  5 Featu… Bihar    admin1            bihar       BI       Bihar             0.5 
#>  6 Featu… Lakshad… admin1            lakshadweep LA       Laksha…           0.5 
#>  7 Featu… Andaman… admin1            andaman an… AA       Andama…           0.5 
#>  8 Featu… Assam    admin1            assam       AS       Assam             0.5 
#>  9 Featu… West Be… admin1            west bengal WB       West B…           0.6 
#> 10 Featu… Puduche… admin1            puducherry  PY       Puduch…           0.62
#> # … with 27 more rows, and 1 more variable: geometry <df[,2]>

推荐阅读