Jak uzyskać JSON ze strony internetowej do skryptu Python


193

Mam następujący kod w jednym z moich skryptów:

#
# 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

To, co chcę zrobić, to pobrać {{.....etc.....}}rzeczy, które widzę na adres URL, gdy ładuję go w Firefoksie do mojego skryptu, aby mógł z niego parsować wartość. Znalazłem tonę w Google, ale nie znalazłem dobrej odpowiedzi na pytanie, w jaki sposób rzeczywiście pobrać {{...}}rzeczy z adresu URL kończącego .jsonsię na obiekcie w skrypcie Python.

Odpowiedzi:


316

Uzyskaj dane z adresu URL, a następnie zadzwoń json.loadsnp

Przykład Python3 :

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)

Przykład Python2 :

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

Dane wyjściowe spowodowałyby coś takiego:

{
"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
Zamiast użycia, json.loadsktóry zużywa użycie łańcucha (dlatego .read()jest wymagany, użyj json.load(response)zamiast tego
awatts

Tylko PSL, zwięzłe i skuteczne
jlandercy

Czy urllib2lepiej jest w Python2?
Jon-Eric

110

Zgaduję, że naprawdę chcesz uzyskać dane z adresu URL:

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

Lub sprawdź dekoder JSON w bibliotece żądań .

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...

zasługuje na zieloną odznakę za to pytanie! dzięki!
Aziz Alto

27

Spowoduje to pobranie słownika w formacie JSON ze strony internetowej z Python 2.X i Python 3.X:

#!/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))

Zobacz także: Przeczytaj i napisz przykład dla JSON


24

Odkryłem, że jest to najłatwiejszy i najbardziej wydajny sposób na uzyskanie JSON ze strony internetowej przy użyciu Python 3:

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

4
To nie działa Musisz zaimportować urlopen z urllib.request, tj.from urllib.request import urlopen
Dawid Laszuk

5

Wszystko, co wywołuje urlopen()(zgodnie z dokumentami ), zwraca obiekt podobny do pliku. Gdy to zrobisz, musisz zadzwonićread() metodę, aby faktycznie pobrać dane JSON przez sieć.

Coś jak:

jsonurl = urlopen(url)

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

5

W Python 2 json.load () będzie działać zamiast json.loads ()

import json
import urllib

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

Niestety, to nie działa w Pythonie 3. json.load to tylko opakowanie wokół json.loads, które wywołuje read () dla obiektu podobnego do pliku. json.loads wymaga obiektu łańcuchowego, a dane wyjściowe urllib.urlopen (url) .read () są obiektem bajtów. Więc trzeba uzyskać kodowanie pliku, aby działało w Pythonie 3.

W tym przykładzie pytamy nagłówki o kodowanie i wracamy do utf-8, jeśli go nie otrzymamy. Obiekt nagłówków różni się w Pythonie 2 i 3, więc należy to zrobić na różne sposoby. Korzystanie z żądań pozwoliłoby uniknąć tego wszystkiego, ale czasami trzeba trzymać się standardowej biblioteki.

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)

Wiem, że sześć nie jest również częścią standardowej biblioteki, ale jest tu pokazana dla wygody. Bez tego potrzebowałbyś bloku if / else lub spróbuj / oprócz bloku, aby ustalić, skąd wziąć urlopen ().
aviso

3

Nie trzeba używać dodatkowej biblioteki do parsowania json ...

json.loads()zwraca słownik .

Więc w twoim przypadku po prostu zrób text["someValueKey"]


3

Późna odpowiedź, ale python>=3.6możesz użyć:

import dload
j = dload.json(url)

Zainstaluj za dloadpomocą:

pip3 install dload

-1

możesz użyć json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

do załadowania pliku json i zapisania go w pliku przydatny jest następujący kod:

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.