Python urllib2: Url'den JSON yanıtı al


91

Python kullanarak bir URL almaya çalışıyorum ve yanıt JSON. Ancak koştuğumda

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

Html str türünde ve bir JSON bekliyorum. Yanıtı bir str yerine JSON veya python sözlüğü olarak yakalamanın bir yolu var mı?


1
Is response.read()geçerli bir JSON dize dönen?
Martijn Pieters

Evet, geçerli bir JSON dizesi, sadece veya tipinde str ve dict değil
Deepak B

Bir nesnenin JSON gösterimi (dict) yerine bir dizenin JSON gösterimiyse, sunucuyu size farklı veriler döndürmeye zorlayamazsınız; muhtemelen farklı bir istekte bulunmanız gerekiyor. Bir JSON temsilini eşdeğer Python nesnesine nasıl ayrıştıracağınızı bilmiyorsanız, Martjin Pieters'ın cevabı doğrudur.
abarnert

Yanıtlar:


184

URL geçerli JSON kodlu verileri döndürüyorsa, bunun kodunu çözmek için jsonkitaplığı kullanın:

import urllib2
import json

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

1
@ ManuelSchneid3r: Buradaki cevap Python 2 içindir, burada okuma responsesize bytestrings ve json.load()bir bytestring'i okumayı beklemektedir. JSON gerekir UTF codec'i kullanılarak kodlanmış ve BOM codepoint sağlanan UTF-8, UTF-16 ve UTF-32 için yukarıda eserler, son iki codec'leri için dahildir. Bağladığınız yanıt UTF-8'in kullanıldığını varsayar, bu genellikle doğrudur çünkü bu varsayılandır. Python 3.6'dan itibaren, jsonkitaplık , UTF kodlamasının kullanılması koşuluyla, JSON verileriyle bayt kodlarını otomatik olarak çözer.
Martijn Pieters

@ ManuelSchneid3r: Aksi takdirde, BOM'un requestseksik olduğu ve yanıt başlığında karakter setinin belirtilmediği durumlarda kullanılacak doğru UTF kodekini otomatik olarak algılayan kitaplığı kullanmanızı öneririm . Sadece response.json()yöntemi kullanın .
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 , Python 3.4
HTTPMessage için , r.info () tarafından döndürülen


1
print dataPython 3 için yanlış olmaktan başka katı kod . Olmalıdır print(data).
David Metcalfe

1
Evet ve 2. satır olmalıdır import urllib.request. Ayrıca, url'deki o .json dosyası artık mevcut değil.
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")

1
vay canına, bu json.dumps () günümü kurtardı.
Lloyd

Django 1.7 + durumunda, JsonResponse'yi doğrudan şu şekilde kullanabilirsinizfrom django.http import JsonResponse return JsonResponse({'key':'value'})
rakun

1
Json.dumps () yerine json.dump () yapıyordum, kendimi aptal hissediyordum, kurtardığın için teşekkürler!
Hashir Baig

4

Doğrulama vb. Konusunda dikkatli olun, ancak doğru çözüm şudur:

import json
the_dict = json.load(response)

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

1

Python 3 standart kitaplık tek satırlık:

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'

0

Sanırım zaten cevaplanmış olsa da, buna biraz da eklemek istiyorum

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

Not: geçirilen nesne json.load () desteklemelidir ) (.read nedenle urllib2.urlopen (self.name) .read () olmaz işi. Doamin geçti bu durumda protokol ile sağlanmalıdır http


0

requestsaşağıdaki gibi kullanarak da json alabilirsiniz :

import requests

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

0

Bu, sorunuza daha basit bir çözümdür

pd.read_json(data)

Burada veri, aşağıdaki kodun str çıktısıdır

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

-1

Burada verilen örneklerin hiçbiri benim için işe yaramadı. Ya Python 2 (uurllib2) içindi ya da Python 3 için olanlar "ImportError: Talep adında modül yok" hatasını döndürür. Hata mesajını google'da aradım ve görünüşe göre bir modülü yüklememi gerektiriyor - bu kadar basit bir görev için açıkça kabul edilemez.

Bu kod benim için çalıştı:

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

2
Belli ki Python 2 kullanıyorsunuz. Python 3'te yok urllib.urlopen; urlopenolan urllib.requestmodül.
Nick Matteo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.