JSON web sayfasından Python betiğine nasıl alınır


193

Betiklerimden birinde şu kodu aldım:

#
# url is defined above.
#
jsonurl = urlopen(url)

#
# While trying to debug, I put this in:
#
print jsonurl

#
# Was hoping text would contain the actual json crap from the URL, but seems not...
#
text = json.loads(jsonurl)
print text

Ne yapmak istiyorum {{.....etc.....}}ben komut dosyası içine Firefox içine yüklediğinizde ben URL üzerinde gördüğüm şeyler almak böylece ben bir değer ayrıştırabilirsiniz. Bir ton aradım, ancak aslında bir Python komut dosyasında bir nesneye {{...}}biten bir URL'den şeyler almak için iyi bir cevap bulamadım .json.

Yanıtlar:


316

URL'den veri alın ve ardından json.loadsörneğin

Python3 örneği :

import urllib.request, json 
with urllib.request.urlopen("http://maps.googleapis.com/maps/api/geocode/json?address=google") as url:
    data = json.loads(url.read().decode())
    print(data)

Python2 örneği :

import urllib, json
url = "http://maps.googleapis.com/maps/api/geocode/json?address=google"
response = urllib.urlopen(url)
data = json.loads(response.read())
print data

Çıktı şu şekilde sonuçlanır:

{
"results" : [
    {
    "address_components" : [
        {
            "long_name" : "Charleston and Huff",
            "short_name" : "Charleston and Huff",
            "types" : [ "establishment", "point_of_interest" ]
        },
        {
            "long_name" : "Mountain View",
            "short_name" : "Mountain View",
            "types" : [ "locality", "political" ]
        },
        {
...

30
Aksine kullanımından daha json.loadsneden olan bir dize kullanımını (tüketir .read()gereklidir kullanmak json.load(response)yerine.
awatts

Sadece PSL, özlü ve verimli
jlandercy

urllib2Python2 tercih?
Jon-Eric

110

Aslında URL'den veri almak istediğinizi tahmin edeceğim:

jsonurl = urlopen(url)
text = json.loads(jsonurl.read()) # <-- read from it

Veya istek kitaplığındaki JSON kod çözücüye bakın .

import requests
r = requests.get('someurl')
print r.json() # if response type was set to JSON, then you'll automatically have a JSON response here...

bu soru için yeşil rozeti hak ediyor! Teşekkürler!
Aziz Alto

27

Bu, Python 2.X ve Python 3.X içeren bir web sayfasından JSON biçiminde bir sözlük alır:

#!/usr/bin/env python

try:
    # For Python 3.0 and later
    from urllib.request import urlopen
except ImportError:
    # Fall back to Python 2's urllib2
    from urllib2 import urlopen

import json


def get_jsonparsed_data(url):
    """
    Receive the content of ``url``, parse it as JSON and return the object.

    Parameters
    ----------
    url : str

    Returns
    -------
    dict
    """
    response = urlopen(url)
    data = response.read().decode("utf-8")
    return json.loads(data)


url = ("http://maps.googleapis.com/maps/api/geocode/json?"
       "address=googleplex&sensor=false")
print(get_jsonparsed_data(url))

Ayrıca bakınız: JSON için örnek okuma ve yazma


24

Python 3 kullanırken bir web sayfasından JSON almanın en kolay ve en etkili yolu olarak buldum:

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

4
Bu işe yaramıyor. Urlopeni urllib.request'ten, yanifrom urllib.request import urlopen
Dawid Laszuk

5

Yapılması gereken tek urlopen()şey ( belgelere göre ) dosya benzeri bir nesne döndürmektir. Bunu yaptıktan sonra, read()aslında ağ üzerinden JSON verilerini çekmek için yöntemini çağırmanız gerekir .

Gibi bir şey:

jsonurl = urlopen(url)

text = json.loads(jsonurl.read())
print text

5

Python 2'de, json.loads () yerine json.load () çalışır

import json
import urllib

url = 'https://api.github.com/users?since=100'
output = json.load(urllib.urlopen(url))
print(output)

Ne yazık ki, bu Python 3'te çalışmaz. Json.load, dosya benzeri bir nesne için read () öğesini çağıran json.loads etrafında sadece bir sarıcıdır. json.loads bir dize nesnesi gerektirir ve urllib.urlopen (url) .read () çıktısı bir bayt nesnesidir. Bu yüzden Python 3'te çalışmasını sağlamak için dosya kodlamasını almak gerekir.

Bu örnekte, kodlama başlıklarını sorgular ve almazsak utf-8'e geri döneriz. Üstbilgi nesnesi, Python 2 ve 3 arasında farklı olduğundan, farklı yollarla yapılması gerekir. İstekleri kullanmak tüm bunları önler, ancak bazen standart kütüphaneye bağlı kalmanız gerekir.

import json
from six.moves.urllib.request import urlopen

DEFAULT_ENCODING = 'utf-8'
url = 'https://api.github.com/users?since=100'
urlResponse = urlopen(url)

if hasattr(urlResponse.headers, 'get_content_charset'):
    encoding = urlResponse.headers.get_content_charset(DEFAULT_ENCODING)
else:
    encoding = urlResponse.headers.getparam('charset') or DEFAULT_ENCODING

output = json.loads(urlResponse.read().decode(encoding))
print(output)

Altısının da standart kütüphanenin bir parçası olmadığını biliyorum, ama burada kolaylık sağlamak için gösteriliyor. Onsuz, nerede urlopen () alacağınızı belirlemek için bir if / else veya try / hariç bloğuna ihtiyacınız olacaktır.
aviso

3

Json'ı ayrıştırmak için fazladan bir kitaplık kullanmaya gerek yok ...

json.loads()bir sözlük döndürür .

Yani senin durumunda, sadece yap text["someValueKey"]


3

Geç cevap, ancak python>=3.6sizin için kullanabilirsiniz:

import dload
j = dload.json(url)

Yükleme yeri dload:

pip3 install dload

-1

şunları kullanabilirsiniz json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

json yüklemek ve dosyaya yazmak için aşağıdaki kod yararlıdır:

data = json.loads(json.dumps(Response, sort_keys=False, indent=4))
with open('data.json', 'w') as outfile:
json.dump(data, outfile, sort_keys=False, indent=4)
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.