从HTML页面导入JSONP数据,然后导出为CSV

时间:2011-02-10 20:07:57

标签: mysql r html-parsing jsonp

我有一些JSON数据,这是一个片段:

{"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网址中获取此信息:

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

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

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

所以它会是:

游戏代码,毛衣,xcoord,队友,力量,时期,类型,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}}})

提前致谢!

3 个答案:

答案 0 :(得分:2)

我写了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)

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

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()生成的列表组合到一个数据框中。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

撰写文件 由于安全限制,对于大多数浏览器而言,在客户端写入文件是有问题的。 在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)