从http请求python返回的格式化
我正在尝试编写一个python脚本,它将从http服务器检索值并将数据更改为csv格式,我正在使用httplib2库来执行请求,但我的问题是返回的内容是application/x-www-form-urlencoded格式,我有用于将数据解析为dict的代码,但似乎不能用它做任何事情,因为这种字符串,我知道它可能对广大用户来说很简单,因为我似乎无法通过研究找到任何关于它的信息 下面是一个示例代码,只是为了说明我正在尝试做的事情的类型和我的问题从http请求python返回的格式化,python,http,parsing,request,url-encoding,Python,Http,Parsing,Request,Url Encoding,我正在尝试编写一个python脚本,它将从http服务器检索值并将数据更改为csv格式,我正在使用httplib2库来执行请求,但我的问题是返回的内容是application/x-www-form-urlencoded格式,我有用于将数据解析为dict的代码,但似乎不能用它做任何事情,因为这种字符串,我知道它可能对广大用户来说很简单,因为我似乎无法通过研究找到任何关于它的信息 下面是一个示例代码,只是为了说明我正在尝试做的事情的类型和我的问题 import httplib2 http = htt
import httplib2
http = httplib2.Http()
resp, content = http.request("http://example.com/foo/bar")
谢谢你的帮助
顺便说一句,我使用的是Python2.7,请求自然返回的格式是json如果您收到的是编码响应,您可以使用
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
感谢您的回复,我已经增加了它,因为这是一个非常好的答案,虽然我应该指定我收到的“内容”在我看来像json,但我不确定是否发布准确的回复,因为我正在检索发票。但是它看起来像是在第7行,还有另外两个维度,尽管如果我尝试将它传递到json.loads()函数中,它会返回一个ValueError:没有json对象。。。这似乎很奇怪,我已经试过了我能在网上找到的所有其他解决方案web@jbaldwin啊,明白了,这使它变得更简单:)所以需要检查的一件事就是响应本身-它是否以有效的格式出现,意思是用双引号括住对符,所有的
{
都与结束}匹配吗
,所有列表正确关闭,没有额外的逗号,等等。你可以用一个基本的、有效的JSON字符串(如上面的示例)测试你当前的技术-如果它有效,响应本身就会有问题。当我把我的代码放在这里时,我在某个论坛上使用了一个链接到的JSON“检查器”,上面说“第45行的分析错误:。。。“v”:(2010年,--------------------------^预期为‘STRING’、‘NUMBER’、‘NULL’、‘TRUE’、‘FALSE’、‘‘’、‘‘‘’、‘‘‘‘‘、‘‘‘、‘‘‘、‘‘‘‘、‘‘‘、‘‘‘’,‘‘,‘‘‘,‘‘‘,‘‘,‘(2010…然后当我查到这个时,它说它用于数据格式,那么数据的格式是否仍然有效?但是我在脚本中提取的版本是{'v':(2010,0,24,21,51,34)format@jbaldwin因此,该值本身((2010,0,24,21,51,34)
)看起来会导致错误,因为它没有括在引号中(由于基本JSON解码器不会将类似元组的表示转换为元组(我猜这可能是因为它不是有效的JavaScript,但我对JS不太熟悉,所以可能忽略这一点:)。您能控制收到的响应吗?