我正在尝试从网站获取标头,用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,但仍然不行(请参阅''而不是“”和其他类似=和;的东西)。 显然有一些(或很多)我没有以正确的方式做。 我试过阅读模块的文档但我无法理解如何解决这个问题。 谢谢你的帮助。
答案 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()}
}