获取Python头文件并转换为JSON(requests - urllib2 - json)

时间:2014-07-02 13:54:08

标签: python json python-2.7 urllib2 python-requests

我正在尝试从网站获取标头,用JSON编码将其写入文件。 我尝试了两种不同的方法但没有成功。

首先使用urllib2和json

import urllib2
import json
host = ("https://www.python.org/")
header = urllib2.urlopen(host).info()
json_header = json.dumps(header)
print json_header

以这种方式我得到了错误:

  

TypeError:不是   JSON可序列化

所以我尝试通过将对象转换为字符串来绕过这个问题 - > json_header = str(标题) 这样我可以json_header = json.dumps(标题),但输出很奇怪:

  

“日期:星期三,2014年7月2日13:33:37 GMT \ r \ n服务器:nginx \ r \ n内容类型:   为text / html;字符集= UTF-8 \ r \ NX帧-选项:   SAMEORIGIN \ r \ nContent-Length:45682 \ r \ nAccept-Ranges:bytes \ r \ nVia:   1.1 varnish \ r \ nAge:1263 \ r \ nX-Served-By:cache-fra1220-FRA \ r \ nX-Cache:HIT \ r \ nX-Cache-Hits:2 \ r \ nVary:Cookie \ r \ nStrict - 传输,安全性:   最大年龄= 63072000; includeSubDomains \ r \ nConnection:关闭\ r \ n“

第二次请求

import requests
r = requests.get(“https://www.python.org/”)
rh = r.headers
print rh
  

{'content-length':'45682','via':'1.1 varnish','x-cache':'HIT',   'accept-ranges':'bytes','strict-transport-security':   “最大年龄= 63072000; includeSubDomains','vary':'Cookie','server':   'nginx','x-served-by':'cache-fra1226-FRA','x-cache-hits':'14',   'date':'Wed,02 Jul 2014 13:39:33 GMT','x-frame-options':   'SAMEORIGIN','content-type':'text / html; charset = utf-8','age':   '1619'}

通过这种方式,输出更像JSON,但仍然不行(请参阅''而不是“”和其他类似=和;的东西)。 显然有一些(或很多)我没有以正确的方式做。 我试过阅读模块的文档但我无法理解如何解决这个问题。 谢谢你的帮助。

4 个答案:

答案 0 :(得分:9)

将标头编码为JSON的方法有多种,但我首先考虑的是将headers属性转换为实际字典,而不是将其作为requests.structures.CaseInsensitiveDict < / p>

import requests, json
r = requests.get("https://www.python.org/")
rh = json.dumps(r.headers.__dict__['_store'])
print rh
  

{&#39; content-length&#39;:(&#39; content-length&#39;,&#39; 45474&#39;),&#39; via&#39;:(&#39; ;通过&#39;,&#39; 1.1   清漆&#39;),&#39; x-cache&#39;:(&#39; x-cache&#39;,&#39; HIT&#39;),&#39;接受范围&#39;:   (&#39;接受范围&#39;,&#39;字节&#39;),&#39; strict-transport-security&#39;:   (&#39; strict-transport-security&#39;,&#39; max-age = 63072000; includeSubDomains&#39;),   &#39;变化&#39;:(&#39;变化&#39;,&#39; Cookie&#39;),&#39;服务器&#39; :(&#39;服务器&#39;,&# 39; nginx的&#39),   &#39; x-served-by&#39;:(&#39; x-served-by&#39;,&#39; cache-iad2132-IAD&#39;),&#39; x-cache-hits& #39 ;:   (&#39; x-cache-hits&#39;,&#39; 1&#39;),&#39; date&#39;:(&#39; date&#39;,&#39; Wed,02 2014年7月14:13:37   GMT&#39;),&#39; x-frame-options&#39;:(&#39; x-frame-options&#39;,&#39; SAMEORIGIN&#39;),   &#39;内容类型&#39;:(&#39;内容类型&#39;,&#39; text / html; charset = utf-8&#39;),&#39;年龄&#39;:   (&#39;年龄&#39;,&#39; 1483&#39;)}

根据您对标题的确切要求,您可以在此之后专门访问它们,但如果格式略有不同,这将为您提供标题中包含的所有信息。

如果您更喜欢其他格式,还可以将标题转换为字典:

import requests, json
r = requests.get("https://www.python.org/")
print json.dumps(dict(r.headers))
  

{&#34; content-length&#34;:&#34; 45682&#34;,&#34; via&#34;:&#34; 1.1 varnish&#34;,&#34; x-cache& #34;:&#34; HIT&#34;,   &#34;接受范围&#34;:&#34;字节&#34;,&#34;严格传输安全&#34;:   &#34;最大年龄= 63072000; includeSubDomains&#34;,&#34;更改&#34;:&#34; Cookie&#34;,&#34;服务器&#34;:   &#34; nginx&#34;,&#34; x-served-by&#34;:&#34; cache-at50-ATL&#34;,&#34; x-cache-hits&#34;:&# 34; 5&#34;,&#34;日期&#34;:   &#34; Wed,02 Jul 2014 14:08:15 GMT&#34;,&#34; x-frame-options&#34;:&#34; SAMEORIGIN&#34;,   &#34; content-type&#34;:&#34; text / html; charset = utf-8&#34;,&#34; age&#34;:&#34; 951&#34;}

答案 1 :(得分:6)

如果您只对标题感兴趣,请提出head请求。转换CaseInsensitiveDict对象中的dict,然后将其转换为json

import requests
import json
r = requests.head('https://www.python.org/')
rh = dict(r.headers)
json.dumps(rh)

答案 2 :(得分:1)

import requests
import json

r = requests.get('https://www.python.org/')
rh = r.headers

print json.dumps( dict(rh) ) # use dict()

结果:

  

{“content-length”:“45682”,“via”:“1.1 varnish”,“x-cache”:“HIT”,“accept-ranges”:“bytes”,“strict-transport-security” :“max-age = 63072000; includeSubDomains”,“vary”:“Cookie”,“server”:“nginx”,“x-served-by”:“cache-fra1224-FRA”,“x-cache-hits” :“5”,“date”:“Wed,02 Jul 2014 14:08:04 GMT”,“x-frame-options”:“SAMEORIGIN”,“content-type”:“text / html; charset = utf- 8“,”年龄“:”3329“}

答案 3 :(得分:0)

我知道这是一个老问题,但是当我试图将一个快速且肮脏的Python curl风格的URL getter组合在一起时,我偶然发现了这个问题。我不断收到错误消息:

TypeError: Object of type 'CaseInsensitiveDict' is not JSON serializable

如果需要立即输出JSON字符串,则上述解决方案很好,但是在我的情况下,我需要返回标头的python字典,并且我想规范化大小写以使所有键都小写。

我的解决方案是使用dict comprehension

import requests

response = requests.head('https://www.python.org/')

my_dict = {
   'body': response.text,
   'http_status_code': response.status_code,
   'headers': {k.lower(): v for (k, v) in response.headers.items()}
}