2012-12-17 10 views
71

Ich versuche, eine URL mit Python abzurufen und die Antwort ist JSON. Jedoch, wenn ich rennePython urllib2: Empfangen von JSON-Antwort von URL

import urllib2 
response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX') 
html=response.read() 
print html 

Die html ist vom Typ str und ich erwarte ein JSON. Gibt es eine Möglichkeit, wie ich die Antwort als JSON oder ein Python-Wörterbuch statt einer Str erfassen kann.

+0

Ist 'response.read()' Rückkehr eines gültiger JSON-String zur Verfügung gestellt werden? –

+0

Ja, es ist eine gültige JSON-Zeichenfolge, oder str und nicht dict –

+0

Wenn es sich um eine JSON-Darstellung einer Zeichenfolge anstelle einer JSON-Darstellung eines Objekts (dict) handelt, können Sie den Server nicht zwingen, Ihnen andere Daten zurückzugeben. Sie müssen wahrscheinlich eine andere Anfrage stellen. Wenn Sie nur nicht wissen, wie Sie eine JSON-Darstellung in das entsprechende Python-Objekt zerlegen, ist die Antwort von Martjin Pieters korrekt. – abarnert

Antwort

157

Wenn die URL gültig JSON-codierten Daten zurückgibt, verwenden Sie die json library dass entschlüsseln:

import urllib2 
import json 

response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX') 
data = json.load(response) 
print data 
4

Seien Sie vorsichtig über die Validierung und etc, aber die gerade Lösung ist dies:

import json 
the_dict = json.load(response) 
29
import json 
import urllib 

url = 'http://example.com/file.json' 
r = urllib.request.urlopen(url) 
data = json.loads(r.read().decode(r.info().get_param('charset') or 'utf-8')) 
print data 

urllib, für Python 3.4
HTTPMessage durch r.info() zurück

1
resource_url = 'http://localhost:8080/service/' 
response = json.loads(urllib2.urlopen(resource_url).read()) 
0

Keines der hier aufgeführten Beispiele funktionierte für mich. Sie waren entweder für Python 2 (uurllib2) oder diejenigen für Python 3 geben den Fehler "ImportError: Kein Modul namens Anfrage" zurück. Ich google die Fehlermeldung und es erfordert anscheinend, dass ich ein Modul installiere - das ist offensichtlich inakzeptabel für solch eine einfache Aufgabe.

Dieser Code funktioniert für mich:

import json,urllib 
data = urllib.urlopen("https://api.github.com/users?since=0").read() 
d = json.loads(data) 
print (d) 
+1

Sie verwenden offensichtlich Python 2. In Python 3 gibt es keine 'urllib.urlopen'; "urlopen" befindet sich im Modul "urllib.request". – Kundor

0

Obwohl ich denke, es hat bereits beantwortet Ich möchte mein kleines bisschen in diesem

import json 
import urllib2 
class Website(object): 
    def __init__(self,name): 
     self.name = name 
    def dump(self): 
    self.data= urllib2.urlopen(self.name) 
    return self.data 

    def convJSON(self): 
     data= json.load(self.dump()) 
    print data 

domain = Website("https://example.com") 
domain.convJSON() 

Hinweis hinzufügen: ein Objekt übergeben json.load() sollte unterstützen .read(), daher urllib2.urlopen (self.name) .read() würde nicht funktionieren. doamin bestanden sollte mit Protokoll in diesem Fall http

2
""" 
Return JSON to webpage 
Adding to wonderful answer by @Sanal 
For Django 3.4 
Adding a working url that returns a json (Source: http://www.jsontest.com/#echo) 
""" 

import json 
import urllib 

url = 'http://echo.jsontest.com/insert-key-here/insert-value-here/key/value' 
respons = urllib.request.urlopen(url) 
data = json.loads(respons.read().decode(respons.info().get_param('charset') or 'utf-8')) 
return HttpResponse(json.dumps(data), content_type="application/json") 
+1

Sie haben mich vor der Codierung Hölle gerettet - danke: D – Garbit

+1

Wow, dass json.dumps() meinen Tag gespeichert. – Lloyd

+0

Im Falle von Django 1.7 +, können Sie JsonResponse direkt wie folgt verwenden 'von django.http import JsonResponse zurückgeben JsonResponse ({'key': 'Wert'})' – raccoon