【问题标题】:Importing JSONP data from HTML page then exporting to CSV从 HTML 页面导入 JSONP 数据,然后导出为 CSV
【发布时间】:2011-06-25 03:02:35
【问题描述】:

我有一些 JSON 数据,这是一个 sn-p:

{"sweater":"15", "localtime":"7:14 PM", "xcoord":-61, 
  "desc":"John Smith SHOT on Jack Jones", "teamid":10,"strength":701,
  "pid":8465200,"formalEventId":"TOR8", "period":1, "type":"Shot", "p3name":"",
   "eventid":8, "p2name":"Jack Jones", "ycoord":21, "pid3":"", "time":"00:38", 
   "playername":"John Smith", "p1name":"John Smith",
   "video":"2_26_ott_tor_0910_TOR8_save_800K_16x9.flv", "pid2":8469461, "pid1":8465200}

我想从具有这种格式的 HTML URL 中获取此信息:

http://foo.com/data/20092010/20090xxxxx/PxP.jsonp

其中 xxxxx 是一个 5 位数的游戏代码,我想从列表中插入(通过循环)。

我最需要的数据是:毛衣、xcoord、teamid、力量、周期、类型、ycoord、时间、玩家姓名以及将游戏代码 (xxxxx) 作为列插入。

原来是这样:

游戏代码、毛衣、xcoord、teamid、强度、周期、类型、ycoord、时间、玩家姓名

然后,让它将所有信息导出到一 (1) 个 CSV 文件中。

谁能帮我指出正确的方向?

编辑:

我尝试使用以下代码将 json 文件作为本地文件导入:

#libraries
library(RCurl)
library(rjson)
library(bitops)

#fetch data
j <- getURL("file:///Desktop/test.jsonp")

#grab JSON
j.list <- fromJSON(j)

#get each data item
j.df <- data.frame(playername = sapply(j.list, function(x) x$sweater))
j.df <- data.frame(xcoord = sapply(j.list, function(x) x$xcoord))
j.df <- data.frame(ycoord = sapply(j.list, function(x) x$ycoord))
j.df <- data.frame(type = sapply(j.list, function(x) x$type))

write.csv(j.df, file="fooPxP.csv")

并获得一个空的 CSV 文件。任何想法我做错了什么?

这里是一些从一开始的实际数据文件:

loadPlayByPlay({"data":{"refreshInterval":0,"game":{"awayteamid":9,"awayteamname":"Ottawa Senators","hometeamname":"Toronto Maple Leafs","plays":{"play":[{"sweater":"11","localtime":"7:14 PM","xcoord":76,"desc":"Daniel Alfredsson HIT on Tomas Kaberle","teamid":9,"strength":701,"pid":8460621,"formalEventId":"TOR51","period":1,"type":"Hit","p3name":"","eventid":51,"p2name":"Tomas Kaberle","ycoord":-40,"pid3":"","time":"00:16","playername":"Daniel Alfredsson","p1name":"Daniel Alfredsson","pid2":8465200,"pid1":8460621},{"sweater":"15","localtime":"7:14 PM","xcoord":-61,"desc":"Tomas Kaberle SHOT on Pascal Leclaire","teamid":10,"strength":701,"pid":8465200,"formalEventId":"TOR8","period":1,"type":"Shot","p3name":"","eventid":8,"p2name":"Pascal Leclaire","ycoord":21,"pid3":"","time":"00:38","playername":"Tomas Kaberle","p1name":"Tomas Kaberle","video":"2_26_ott_tor_0910_TOR8_save_800K_16x9.flv","pid2":8469461,"pid1":8465200}}})

提前致谢!

【问题讨论】:

    标签: mysql r html-parsing jsonp


    【解决方案1】:

    有用于从 URL 读取任何内容的 R 函数(请参阅 help(download.file),以及 CRAN 上用于处理 json 数据的 rjson 包。如果它真的是 JSONP,则可能需要进行一些调整。

    对于类似的示例,请查看我的 geonames 包 - 它从 geonames.org 读取 JSON 数据并构建数据框。

    如果它不在 CRAN 上,那么它在 R-Forge 上。我忘记了。。

    【讨论】:

      【解决方案2】:

      编写文件 由于安全限制,对于大多数浏览器来说,在客户端中写入文件是有问题的。 只有在 Internet Explorer 中,您才能使用 execCommand 写入文件 - 例如 http://4umi.com/web/javascript/filewrite.php

      将 json 转换为 CSV 我遇到了从 json 转换为 csv 的问题。 http://skysanders.net/subtext/archive/2010/09/19/json-to-csv.aspx

      替代方案 在服务器上生成转换并下载到浏览器纯文本(这是mime text/plain)

      【讨论】:

        【解决方案3】:

        我写了an article 从 URL 获取 JSON 并转换为数据框,这可能会帮助您入门。

        您可以使用 RCurl 库中的 getURL() 获取数据,如下所示:

        library(RCurl)
        j <- getURL("http://foo.com/data/20092010/20090xxxxx/PxP.jsonp")
        

        接下来,rjson 包中的 fromJSON() 应该将其转换为列表:

        library(rjson)
        j.list <- fromJSON(j)
        

        然后您可以从列表中构造一个数据框。例如,要获取名为“毛衣”的列,请尝试:

        j.df <- data.frame(sweater = sapply(j.list, function(x) x$sweater))
        

        只需使用其他 JSON 键将更多列作为参数添加到 data.frame()。

        要添加“xxxxx”,您需要使用 grep() 之类的方法解析 URL。

        获得数据框后,您可以使用 write.table() 或 write.csv() 写入 CSV。对于许多 URL,您必须弄清楚如何将 fromJSON() 生成的列表组合到一个数据框中。

        【讨论】:

        • 太棒了,谢谢!所以对于“强度”,它将是: j.df
        • 好的,所以我尝试了这个,得到了错误并意识到我从中获取数据的 URL 在信息之前有这个:loadPlayByPlay - 我如何让它“跳过”那个?或者,我可以从文本文件中导入信息而不是 URL?
        • 我认为您可以将文本文件的名称传递给 fromJSON()。或者,使用 R 中的字符串处理函数之一将 URL 修改为正确的形式。
        • 这个“loadPlayByPlay”是jsonp回调函数——它是一个启用跨站点脚本的技巧。阅读 json 和 jsonp 之间的区别。在 R 中,使用 gsub 或 substr 之类的东西来删除您需要的位。目标网站可能通过不同的 URL 提供纯 json。
        • 我用我正在尝试的一些代码和实际 JSON 代码的片段编辑了我的 origanl Q,以及它是如何开始的。再次提前感谢。
        猜你喜欢
        • 2016-04-24
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2021-10-12
        相关资源
        最近更新 更多