So erhalten Sie JSON von einer Webseite in ein Python-Skript

191

Ich habe den folgenden Code in einem meiner Skripte erhalten:

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

Ich möchte das, {{.....etc.....}}was ich auf der URL sehe, abrufen, wenn ich es in Firefox in mein Skript lade, damit ich einen Wert daraus analysieren kann. Ich habe eine Menge gegoogelt, aber ich habe keine gute Antwort gefunden, wie man das {{...}}Zeug tatsächlich von einer URL erhält, die .jsonin einem Python-Skript in einem Objekt endet .

Chris B.
quelle

Antworten:

313

Holen Sie sich Daten von der URL und rufen Sie dann json.loadsz

Python3-Beispiel :

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-Beispiel :

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

Die Ausgabe würde ungefähr so ​​ergeben:

{
"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" ]
        },
        {
...
Anurag Uniyal
quelle
29
Anstatt zu verwenden, json.loadswas eine Zeichenfolge verbraucht (weshalb dies .read()erforderlich ist, verwenden Sie json.load(response)stattdessen.
awatts
Nur PSL, prägnant und effizient
jlandercy
Ist urllib2in Python2 vorzuziehen?
Jon-Eric
110

Ich gehe davon aus, dass Sie tatsächlich Daten von der URL erhalten möchten:

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

Oder überprüfen Sie den JSON-Decoder in der Anforderungsbibliothek .

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...
Jon Clements
quelle
verdient das grüne Abzeichen für diese Frage! Vielen Dank!
Aziz Alto
27

Dadurch wird ein Wörterbuch im JSON-Format von einer Webseite mit Python 2.X und Python 3.X abgerufen:

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

Siehe auch: Lese- und Schreibbeispiel für JSON

Martin Thoma
quelle
24

Ich habe festgestellt, dass dies der einfachste und effizienteste Weg ist, um JSON von einer Webseite zu erhalten, wenn Python 3 verwendet wird:

import json,urllib.request
data = urllib.request.urlopen("https://api.github.com/users?since=100").read()
output = json.loads(data)
print (output)
Uxbridge
quelle
4
Das funktioniert nicht. Sie müssen urlopen von urllib.request importieren, dhfrom urllib.request import urlopen
Dawid Laszuk
5

Alles, was der Aufruf von urlopen()(gemäß den Dokumenten ) bewirkt, ist die Rückgabe eines dateiähnlichen Objekts. Sobald Sie das haben, müssen Sie seine read()Methode aufrufen , um die JSON-Daten tatsächlich über das Netzwerk zu ziehen.

Etwas wie:

jsonurl = urlopen(url)

text = json.loads(jsonurl.read())
print text
bgporter
quelle
5

In Python 2 funktioniert json.load () anstelle von json.loads ()

import json
import urllib

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

Leider funktioniert das in Python 3 nicht. Json.load ist nur ein Wrapper um json.loads, der read () für ein dateiähnliches Objekt aufruft. json.loads erfordert ein String-Objekt und die Ausgabe von urllib.urlopen (url) .read () ist ein Byte-Objekt. Man muss also die Dateicodierung erhalten, damit sie in Python 3 funktioniert.

In diesem Beispiel fragen wir die Header nach der Codierung ab und greifen auf utf-8 zurück, wenn wir keine erhalten. Das Header-Objekt unterscheidet sich zwischen Python 2 und 3, daher muss es auf unterschiedliche Weise ausgeführt werden. Die Verwendung von Anforderungen würde all dies vermeiden, aber manchmal müssen Sie sich an die Standardbibliothek halten.

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)
aviso
quelle
Ich weiß, dass sechs auch nicht Teil der Standardbibliothek sind, aber es wird hier der Einfachheit halber gezeigt. Ohne sie benötigen Sie einen if / else- oder try / Except-Block, um zu bestimmen, wo Sie urlopen () erhalten.
Aviso
3

Es ist nicht erforderlich, eine zusätzliche Bibliothek zu verwenden, um den JSON zu analysieren ...

json.loads()gibt ein Wörterbuch zurück .

Also in Ihrem Fall einfach tun text["someValueKey"]

Posit Labs
quelle
3

Späte Antwort, aber für python>=3.6Sie können verwenden:

import dload
j = dload.json(url)

Installieren dloadmit:

pip3 install dload
CONvid19
quelle
-1

Sie können verwenden json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

Zum Laden von json und zum Schreiben in eine Datei ist der folgende Code hilfreich:

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)
Keivan
quelle