Hoe u JSON kunt krijgen van webpagina in Python-script

Kreeg de volgende code in een van mijn scripts:

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

Wat ik wil doen is de {{.....etc.....}}dingen die ik zie op de URL wanneer ik het in Firefox in mijn script laad Ik kan er een waarde uit parseren. Ik heb een ton googled, maar ik heb geen goed antwoord gevonden dat hoe je daadwerkelijk de {{...}}dingen van een URL eindigt in .jsonin een object in een python-script.


1, Autoriteit 100%

Krijg gegevens van de URL en bel dan json.loadsE.G.

Python3-voorbeeld :

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

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

De uitgang zou resulteren in zoiets:

{
"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" ]
        },
        {
...

Antwoord 2, autoriteit 38%

Ik gok dat je daadwerkelijk gegevens van de URL wilt halen:

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

Of bekijk JSON-decoderin de verzoekenbibliotheek.

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

Antwoord 3, autoriteit 8%

Dit krijgt een woordenboek in JSON-formaat van een webpagina met Python 2.X en 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))

Zie ook: Lees- en schrijfvoorbeeld voor JSON


4, Autoriteit 7%

Ik heb dit gevonden om de gemakkelijkste en meest efficiënte manier te zijn om JSON te krijgen van een webpagina bij gebruik van Python 3:

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

5, Autoriteit 2%

Alles wat de oproep naar urlopen()doet (volgens de Docs ) is een bestand-achtig object retourneren. Zodra u dat hebt, moet u zijn read()-methode bellen om de JSON-gegevens in het hele netwerk daadwerkelijk te trekken.

Zoiets als:

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

6

In Python 2, JSON.LOAD () werkt in plaats van JSON.LOADS ()

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

Helaas werkt dat niet in Python 3. json.load is slechts een wrapper rond json.loads die read() aanroept voor een bestandsachtig object. json.loads vereist een string-object en de uitvoer van urllib.urlopen(url).read() is een bytes-object. Je moet dus de bestandscodering hebben om het in Python 3 te laten werken.

In dit voorbeeld vragen we de headers voor de codering en vallen terug naar utf-8 als we er geen krijgen. Het headers-object verschilt tussen Python 2 en 3, dus het moet op verschillende manieren worden gedaan. Het gebruik van verzoekenzou dit alles vermijden, maar soms moet je je aan de standaardbibliotheek houden.

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)

Antwoord 7

Voor python>=3.6kun je gebruiken:

import dload
j = dload.json(url)

Installeer dloadmet:

pip3 install dload

Antwoord 8

Het is niet nodig om een extra bibliotheek te gebruiken om de json te ontleden…

json.loads()retourneert een woordenboek.

Dus in jouw geval, doe gewoon text["someValueKey"]


Antwoord 9

Ik weet niet zeker waarom alle eerdere antwoorden json.loadsgebruiken. Alles wat je nodig hebt is:

import json
from urllib.request import urlopen
f = urlopen("https://www.openml.org/d/40996/json")
j = json.load(f)

Dit werkt omdat urlopeneen bestandsachtig object retourneert, dat werkt met json.load.


Antwoord 10

u kunt json.dumpsgebruiken:

import json
# Hier comes you received data
data = json.dumps(response)
print(data)

voor het laden van json en het in het bestand schrijven is de volgende code handig:

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)

Other episodes