2012-12-03 103 views
0

我想写一个python脚本,它将从http服务器检索值并将数据更改为csv格式,我使用httplib2库来执行请求,但我的问题是返回的内容是在应用程序/ x-www-form-urlencoded格式,我有代码解析数据为字典,但似乎无法做任何事情,因为这种字符串,我知道它可能看起来简单广泛的用户,因为我似乎无法找到这个通过研究任何信息...从http请求格式化返回python

下面

是一个示例代码,只是想说明的,我试图做的事情的类型和我的问题

import httplib2 
http = httplib2.Http() 

resp, content = http.request("http://example.com/foo/bar") 

谢谢你的帮助

顺便说一句,我使用python 2.7和要求自然返回格式是JSON

回答

2

如果您收到了编码的响应,您可以使用urllib.unquote的转义字符替换成自己的'实际'表示。一旦你这样做了,你可以使用json模块作为Python对象加载字符串,然后使用csv模块根据响应创建CSV。您回应的结构将决定如何将设置你的目的,但希望这将让你在正确的道路上:

In [1]: import csv 

In [2]: import json 

In [3]: import urllib 

In [4]: json_resp = urllib.quote('[{"name": "John Doe", "age": 35}, {"name": "Jane Doe", "age": 33}]') 

In [5]: json_resp # What I believe your response looks like 
Out[5]: '%5B%7B%22name%22%3A%20%22John%20Doe%22%2C%20%22age%22%3A%2035%7D%2C%20%7B%22name%22%3A%20%22Jane%20Doe%22%2C%20%22age%22%3A%2033%7D%5D' 

In [6]: resp = urllib.unquote(json_resp) #'Unquote' the response 

In [7]: resp 
Out[7]: '[{"name": "John Doe", "age": 35}, {"name": "Jane Doe", "age": 33}]' 

In [8]: content = json.loads(resp) # Turn the resp into a Python object 

In [9]: fieldnames = ('name', 'age') # Specify the order in which to write fields 

In [10]: with open('mycsv.csv', 'wb') as f: 
    ....:  writer = csv.DictWriter(f, fieldnames) 
    ....:  writer.writeheader() # Python 2.7+ 
    ....:  for item in content: 
    ....:   writer.writerow(item) 
    ....: 
    ....: 

这会写一个CSV,看起来像:

name,age 
John Doe,35 
Jane Doe,33 
+0

谢谢你的回应,我已经提出了它,因为这是一个非常好的答案,但我应该指定我收到的'内容',对我来说看起来像json,我犹豫发布确切的回复,因为它是发票I正在检索。但它看起来像你在第7行,另外两个维度,虽然如果我尝试将它传递到json.loads()函数它返回一个ValueError:没有Json对象...这似乎很奇怪,我已经尝试了所有其他解决方案,我可以在网络上找到 – jbaldwin

+1

@jbaldwin呃,这让它变得简单一点:)然后,检查一下是响应本身 - 它是否显示为有效格式,意思是双倍 - 用于包含辅助对象的引号,都与关闭的'}匹配,所有列表正确关闭,没有额外的逗号等。您可以使用基本的有效JSON字符串测试当前技术(如上面的例子) - 如果它起作用,这将是响应本身的问题。 – RocketDonkey

+0

我在某个论坛上使用了json'checker'链接到某个论坛的人,http://jsonlint.com/当我将代码放在这里时,它说:“解析第45行的错误: ...”v“:(2010, -----------------------^ 期待'STRING','NUMBER','NULL','TRUE','FALSE',' {''''''但是我对java的了解不多,当我以不同的方式来看待这个问题时,有时我会得到newDate(2010 ...然后当我查看它时,它说它是用于数据格式,那么数据的格式化仍然有效? – jbaldwin