2012-12-17 10 views
71

Próbuję uzyskać adres URL za pomocą Pythona, a odpowiedź to JSON. Jednak po uruchomieniuPython urllib2: Otrzymuję odpowiedź JSON z adresu URL

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

HTML jest typu str i oczekuję JSON. Czy istnieje sposób, w jaki mogę przechwycić odpowiedź jako JSON lub słownik python zamiast a str.

+0

jest 'response.read()' powrocie prawidłowy ciąg JSON? –

+0

Tak, jest to poprawny ciąg JSON jego argumentu just lub type, a nie dyktuje –

+0

Jeśli jest to reprezentacja JSON łańcucha, a nie reprezentacja JSON obiektu (dict), nie można wymuszać na serwerze zwracania różnych danych; prawdopodobnie musisz podać inną prośbę. Jeśli po prostu nie wiesz, jak przeanalizować reprezentację JSON w równoważnym obiekcie Pythona, odpowiedź Martjina Pietersa jest poprawna. – abarnert

Odpowiedz

157

Jeśli adres URL jest zwrócenie poprawnych danych JSON-zakodowane, użyj json library zdekodować że:

import urllib2 
import json 

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

Bądź ostrożny walidacji i etc, ale proste rozwiązanie to:

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, Pythona 3,4
HTTPMessage, zwrócony przez r.info()

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

Żaden z podanych przykładów tutaj nie zadziałał. Były albo dla Python 2 (uurllib2), albo dla Pythona 3 zwracają błąd "ImportError: No module named request". I google komunikat o błędzie i najwyraźniej wymaga mnie do zainstalowania modułu - co jest oczywiście niedopuszczalne dla tak prostego zadania.

Ten kod pracował dla mnie:

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

Najwyraźniej używasz Pythona 2. W Pythonie 3 nie ma 'urllib.urlopen'; 'urlopen' znajduje się w module' urllib.request'. – Kundor

0

Choć myślę, że już odpowiedział Chciałbym dodać mój trochę w tym

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() 

Uwaga: obiekt przekazany do json.load() powinien obsługiwać .read(), dlatego urllib2.urlopen (self.name) .read() nie działa. Doamin przepuszczane powinny być zaopatrzone w protokole w tym przypadku 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

Uratowałeś mnie przed kodowaniem piekła - dzięki: D – Garbit

+1

whew, że json.dumps() zapisał mój dzień. – Lloyd

+0

W przypadku Django 1.7 +, możesz użyć JsonResponse bezpośrednio w następujący sposób: 'od django.http import JsonResponse return JsonResponse ({'klucz': 'wartość'})) – raccoon

Powiązane problemy