2014-07-02 5 views
5

मैं किसी वेबसाइट से शीर्षलेख प्राप्त करने का प्रयास कर रहा हूं, इसे फ़ाइल में लिखने के लिए JSON में एन्कोड करें। मैंने सफलता के बिना दो अलग-अलग तरीकों की कोशिश की है। -> json_header = strपायथन के साथ एक शीर्षलेख प्राप्त करें और JSON (अनुरोध - urllib2 - json) में कनवर्ट करें

TypeError: is not JSON serializable

तो मैं एक स्ट्रिंग के लिए वस्तु परिवर्तित करके इस मुद्दे को बायपास करने के लिए प्रयास करें:

urllib2 और इस तरह से json

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

साथ सबसे पहले मैं त्रुटि मिलती है (हेडर) इस तरह से मैं json_header कर सकते हैं = json.dumps (हेडर) में लेकिन उत्पादन में यह अजीब है:

"Date: Wed, 02 Jul 2014 13:33:37 GMT\r\nServer: nginx\r\nContent-Type: text/html; charset=utf-8\r\nX-Frame-Options: 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-Transport-Security: max-age=63072000; includeSubDomains\r\nConnection: close\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': 'max-age=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'}

इस तरह के साथ 10

दूसरा उत्पादन की तरह अधिक JSON, लेकिन अभी भी ठीक नहीं ('' के बजाय "के" और = जैसे अन्य सामान और देखो;) है। जाहिर है कि कुछ (या बहुत कुछ) मैं सही तरीके से नहीं कर रहा हूं। मैंने मॉड्यूल के दस्तावेज को पढ़ने की कोशिश की है लेकिन मुझे समझ में नहीं आता कि इस समस्या को कैसे हल किया जाए। आपकी मदद के लिए धन्यवाद।

उत्तर

8

के कुछ तरीके हैं JSON के रूप में हेडर एन्कोड करने के लिए की तुलना में अधिक हैं, लेकिन मेरा पहला विचार headers विशेषता के रूप में requests.structures.CaseInsensitiveDict

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

{'content-length': ('content-length', '45474'), 'via': ('via', '1.1 varnish'), 'x-cache': ('x-cache', 'HIT'), 'accept-ranges': ('accept-ranges', 'bytes'), 'strict-transport-security': ('strict-transport-security', 'max-age=63072000; includeSubDomains'), 'vary': ('vary', 'Cookie'), 'server': ('server', 'nginx'), 'x-served-by': ('x-served-by', 'cache-iad2132-IAD'), 'x-cache-hits': ('x-cache-hits', '1'), 'date': ('date', 'Wed, 02 Jul 2014 14:13:37 GMT'), 'x-frame-options': ('x-frame-options', 'SAMEORIGIN'), 'content-type': ('content-type', 'text/html; charset=utf-8'), 'age': ('age', '1483')}

के आधार पर उस तक पहुंचने में के बजाय एक वास्तविक शब्दकोश में परिवर्तित करने के लिए किया जाएगा ठीक है आप हेडर पर जो चाहते हैं, उसके बाद आप उन्हें विशेष रूप से एक्सेस कर सकते हैं, लेकिन यह आपको थोड़ा अलग प्रारूप में, हेडर में निहित सभी जानकारी देगा।

आप एक अलग स्वरूप को पसंद करते हैं, तो आप भी अपने हेडर एक शब्दकोश में परिवर्तित कर सकते हैं:

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

{"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-at50-ATL", "x-cache-hits": "5", "date": "Wed, 02 Jul 2014 14:08:15 GMT", "x-frame-options": "SAMEORIGIN", "content-type": "text/html; charset=utf-8", "age": "951"}

+0

आपको बहुत धन्यवाद @ स्लेटर टायरनस। आपकी दूसरी विधि यह वही है जो मैं खोज रहा था। जिज्ञासा से सिर्फ एक प्रश्न। अपनी पहली विधि के आउटपुट को पढ़ते हुए मैं देखता हूं कि चाबियाँ और मान '' के अंदर हैं। Json.dumps उस मामले में क्यों करता है? क्या वैध JSON प्रारूप में "" के अंदर मान होना चाहिए? –

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", "age": "3329"}

+0

आपकी मदद @furas के लिए धन्यवाद –

6

आप केवल में रुचि रखते हैं हेडर, head अनुरोध करें। ऑब्जेक्ट में CaseInsensitiveDict को कन्वर्ट करें और फिर इसे json में कनवर्ट करें।

import requests 
import json 
r = requests.head('https://www.python.org/') 
rh = dict(r.headers) 
json.dumps(rh) 
संबंधित मुद्दे