2014-07-02 4 views
5

Ich versuche, den Header von einer Website zu bekommen, kodieren Sie es in JSON, um es in eine Datei zu schreiben. Ich habe zwei verschiedene Möglichkeiten ohne Erfolg ausprobiert.Holen Sie sich eine Kopfzeile mit Python und konvertieren in JSON (Anfragen - urllib2 - JSON)

FIRST mit urllib2 und json

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

auf diese Weise erhalte ich die Fehlermeldung:

TypeError: is not JSON serializable

Also versuche ich, dieses Problem zu umgehen, indem das Objekt in einen String konvertieren -> json_header = str (Header) Auf diese Weise ich json_header kann = json.dumps (Header), aber der Ausgang es ist seltsam:

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

SECOND mit Anfragen

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'}

Auf diese Weise ist die Ausgabe wie mehr JSON, aber immer noch nicht in Ordnung (siehe ‚‚anstelle von „„und anderen Sachen wie die = und;). Offensichtlich gibt es etwas (oder viel) Ich mache nicht auf die richtige Weise. Ich habe versucht, die Dokumentation der Module zu lesen, aber ich kann nicht verstehen, wie man dieses Problem löst. Vielen Dank für Ihre Hilfe.

Antwort

8

Es gibt mehr als ein paar Möglichkeiten Header als JSON zu kodieren, aber mein erster Gedanke wäre, das headers Attribut auf ein tatsächliches Wörterbuch zu konvertieren, anstatt es den Zugriff auf als 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')}

Je nach genau das, was Sie an den Headern haben wollen, können Sie danach gezielt darauf zugreifen, aber dies wird Ihnen alle Informationen geben, die in den Headern enthalten sind, wenn in einem etwas anderen Format.

Wenn Sie ein anderes Format bevorzugen, können Sie auch Ihre Header in ein Wörterbuch konvertieren:

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

Vielen Dank @Slater Tyranus. Ihre zweite Methode ist genau das, wonach ich gesucht habe. Nur eine Frage aus Neugier. Wenn ich die Ausgabe Ihrer ersten Methode lese, sehe ich, dass Schlüssel und Werte in '' 'sind. Warum macht json.dumps das in diesem Fall? Sollte ein gültiges JSON-Format Werte in "" enthalten? –

1
import requests 
import json 

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

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

Ergebnis:

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

Vielen Dank für Ihre Hilfe @furas –

6

Wenn Sie in der nur daran interessiert sind Header, machen Sie eine head Anfrage. wandle das CaseInsensitiveDict in ein dict Objekt um und wandle es dann in json um.

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