2014-07-02 14 views
5

Bir web sitesinden başlık almayı deniyorum, bir dosyaya yazmak için JSON içinde kodlarım. İki farklı yolu başarıdan denedim. -> json_header = strPython ile bir üstbilgi edinin ve JSON'a dönüştürün (istekleri - urllib2 - json)

TypeError: is not JSON serializable

Bu yüzden bir dizeye nesneyi dönüştürerek bu sorunu aşmaya çalışacağız: bu şekilde urllib2 ve json

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

ile İLK

hatası alıyorum Ben json.dumps (başlık) = json_header bu yolla (başlık) ama çıkış bu garip:

"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"

istekleri

Bu şekilde
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'}

ile 10

İKİNCİ çıkış fazlası gibi JSON ama yine tamam değil (‘‘yerine “nin“ve diğer şeyler = gibi görmek;) 'dir. Açıkçası, doğru şekilde yapmadığım bir şey var (ya da çok). Modüllerin belgelerini okumayı denedim, ancak bu sorunun nasıl çözüleceğini anlayamıyorum. Yardımlarınız için teşekkür ederiz.

cevap

8

Orada JSON olarak başlıklarını kodlamak için birkaç şekilde daha fazladır, ama benim ilk düşüncem 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')}

bağlı olarak erişmek yerine gerçek bir sözlüğe headers niteliğini dönüştürmek olacaktır Tam olarak istediğiniz başlıklara tam olarak bunlardan sonra erişebilirsiniz, ancak bu, başlıklarda yer alan tüm bilgileri, biraz farklı bir formatta verecektir. Eğer farklı bir biçim tercih ederseniz

, ayrıca bir sözlüğe üstbilgilerinizi dönüştürebilirsiniz:

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

Teşekkürler Çok fazla @Slater Tyranus. İkinci yöntemin tam olarak aradığım şey bu. Meraktan sadece bir soru. İlk yönteminizin çıktısını okurken bu anahtarların ve değerlerin içinde olduğunu görüyorum ''. Neden bu durumda json.dumps bunu yapar? Geçerli bir JSON biçiminin "" içinde değerleri var mı? –

1
import requests 
import json 

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

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

sonucu: Eğer sadece ilgileniyorsanız

{"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

Yardımlarınız için teşekkür ederiz @furas –

6

Üstbilgi, bir head isteği yapın. CaseInsensitiveDict'u dict nesnesine dönüştürüp json'a dönüştürün.

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