Python urllib2: Terima tanggapan JSON dari url

90

Saya mencoba MENDAPATKAN URL menggunakan Python dan responsnya adalah JSON. Namun, saat saya lari

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

Html adalah tipe str dan saya mengharapkan JSON. Apakah ada cara saya dapat menangkap respons sebagai JSON atau kamus python alih-alih str.

Deepak B
sumber
1
Apakah response.read()mengembalikan string JSON yang valid?
Martijn Pieters
Ya itu string JSON yang valid itu hanya atau ketik str dan bukan dict
Deepak B
Jika ini adalah representasi JSON dari sebuah string, bukan representasi JSON dari sebuah objek (dict), Anda tidak dapat memaksa server untuk mengembalikan data yang berbeda kepada Anda; Anda mungkin perlu membuat permintaan yang berbeda. Jika Anda tidak tahu cara mengurai representasi JSON menjadi objek Python yang setara, jawaban Martjin Pieters benar.
abarnert

Jawaban:

183

Jika URL menampilkan data yang dikodekan JSON yang valid, gunakan jsonperpustakaan untuk mendekodekan bahwa:

import urllib2
import json

response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
data = json.load(response)   
print data
Martijn Pieters
sumber
1
@ ManuelSchneid3r: Jawabannya di sini adalah untuk Python 2, di mana membaca dari responsememberi Anda bytestrings, dan json.load()mengharapkan untuk membaca bytestring. JSON harus dienkode menggunakan codec UTF, dan yang di atas berfungsi untuk UTF-8, UTF-16, dan UTF-32, asalkan titik kode BOM disertakan untuk dua codec terakhir. Jawaban yang Anda tautkan ke anggapan UTF-8 digunakan, yang biasanya benar karena itulah defaultnya. Mulai Python 3.6, jsonpustaka otomatis mendekode bytecode dengan data JSON asalkan pengkodean UTF digunakan.
Martijn Pieters
@ ManuelSchneid3r: Jika tidak, saya akan merekomendasikan Anda menggunakan requestspustaka, yang juga secara otomatis mendeteksi codec UTF yang benar untuk digunakan dalam kasus di mana BOM hilang dan tidak ada kumpulan karakter yang ditentukan di header respons. Gunakan saja response.json()metodenya.
Martijn Pieters
35
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 , untuk Python 3.4
HTTPMessage , dikembalikan oleh r.info ()

SanalBathery
sumber
1
Kode yang solid selain print datasalah untuk Python 3. Seharusnya print(data).
David Metcalfe
1
Ya dan baris 2 seharusnya import urllib.request. Selain itu, file .json tersebut di url sudah tidak ada lagi.
hack-tramp
5
"""
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")
rakun
sumber
1
Wah, json.dumps () itu menyelamatkan hari saya.
Lloyd
Dalam kasus Django 1.7 +, Anda dapat menggunakan JsonResponse secara langsung sebagai berikut from django.http import JsonResponse return JsonResponse({'key':'value'})
raccoon
1
Saya melakukan json.dump () bukannya json.dumps (), merasa bodoh, Terima kasih atas penyelamatannya!
Hashir Baig
4

Hati-hati dengan validasi dan lain-lain, tetapi solusi langsungnya adalah ini:

import json
the_dict = json.load(response)
MostafaR
sumber
2
resource_url = 'http://localhost:8080/service/'
response = json.loads(urllib2.urlopen(resource_url).read())
Jossef Harush
sumber
1

Perpustakaan standar Python 3 satu baris:

load(urlopen(url))

# imports (place these above the code before running it)
from json import load
from urllib.request import urlopen
url = 'https://jsonplaceholder.typicode.com/todos/1'
Adam
sumber
0

Meskipun saya kira itu sudah menjawab, saya ingin menambahkan sedikit saya dalam hal ini

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

Catatan: objek yang diteruskan ke json.load () harus mendukung .read () , oleh karena itu urllib2.urlopen (self.name) .read () tidak akan berfungsi. Doamin pass harus dilengkapi dengan protokol dalam hal ini http

Nitigya Sharma
sumber
0

Anda juga bisa mendapatkan json dengan menggunakan requestsseperti di bawah ini:

import requests

r = requests.get('http://yoursite.com/your-json-pfile.json')
json_response = r.json()
Haritsinh Gohil
sumber
0

Ini adalah solusi lain yang lebih sederhana untuk pertanyaan Anda

pd.read_json(data)

dimana data adalah keluaran str dari kode berikut

response = urlopen("https://data.nasa.gov/resource/y77d-th95.json")
json_data = response.read().decode('utf-8', 'replace')
Himanshu Aggarwal
sumber
-1

Tak satu pun dari contoh yang diberikan di sini berhasil untuk saya. Mereka baik untuk Python 2 (uurllib2) atau Python 3 mengembalikan kesalahan "ImportError: Tidak ada modul bernama permintaan". Saya google pesan kesalahan dan tampaknya mengharuskan saya untuk menginstal modul - yang jelas tidak dapat diterima untuk tugas yang begitu sederhana.

Kode ini berfungsi untuk saya:

import json,urllib
data = urllib.urlopen("https://api.github.com/users?since=0").read()
d = json.loads(data)
print (d)
Uxbridge
sumber
2
Anda jelas menggunakan Python 2. Dengan Python 3, tidak ada urllib.urlopen; urlopenada di dalam urllib.requestmodul.
Nick Matteo