2012-12-17 29 views
71

Tôi đang cố gắng GET URL bằng Python và phản hồi là JSON. Tuy nhiên, khi tôi chạyPython urllib2: Nhận phản hồi JSON từ url

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

html thuộc loại str và tôi đang mong đợi JSON. Có cách nào tôi có thể nắm bắt các phản ứng như JSON hoặc một từ điển python thay vì một str.

+0

là 'response.read() 'trả về một chuỗi JSON hợp lệ? –

+0

Có một chuỗi JSON hợp lệ của nó chỉ hoặc loại str và không dict –

+0

Nếu nó là một biểu diễn JSON của một chuỗi, chứ không phải là một đại diện JSON của một đối tượng (dict), bạn không thể ép buộc máy chủ trả lại cho bạn dữ liệu khác nhau; bạn có thể cần phải thực hiện một yêu cầu khác. Nếu chỉ là bạn không biết cách phân tích cú pháp một biểu diễn JSON thành đối tượng Python tương đương, câu trả lời của Martjin Pieters là chính xác. – abarnert

Trả lời

157

Nếu URL đang trở lại dữ liệu JSON-encoded hợp lệ, sử dụng json library để giải mã rằng:

import urllib2 
import json 

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

Hãy cẩn thận về việc phê chuẩn và vv, nhưng giải pháp thẳng là thế này:

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, cho Python 3.4
HTTPMessage, trả lại bởi r.info()

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

Không có ví dụ nào được cung cấp ở đây có hiệu quả đối với tôi. Họ hoặc là cho Python 2 (uurllib2) hoặc cho Python 3 trả về lỗi "ImportError: No module named request". Tôi google các thông báo lỗi và nó dường như đòi hỏi tôi phải cài đặt một mô-đun - đó là rõ ràng là không thể chấp nhận cho một nhiệm vụ đơn giản như vậy.

Mã này đã làm việc cho tôi:

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

Bạn rõ ràng đang sử dụng Python 2. Trong Python 3, không có 'urllib.urlopen'; 'urlopen' nằm trong mô-đun' urllib.request'. – Kundor

0

Mặc dù tôi đoán nó đã trả lời tôi muốn thêm chút tôi trong này

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

Lưu ý: đối tượng truyền cho json.load() phải hỗ trợ .read(), do đó urllib2.urlopen (self.name) .read() sẽ không hoạt động. Doamin trôi qua cần được cung cấp với giao thức trong trường hợp này 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

Bạn đã lưu tôi khỏi mã hóa địa ngục - cảm ơn: D – Garbit

+1

whew, json.dumps() đã lưu ngày của tôi. – Lloyd

+0

Trong trường hợp Django 1.7 +, bạn có thể sử dụng JsonResponse trực tiếp như sau 'từ django.http nhập JsonResponse trả về JsonResponse ({'key': 'value'})' – raccoon