2012-10-18 16 views
90

Mam następujący kod w jednym z moich skryptów:Jak zdobyć JSON ze strony internetowej do skryptu Pythona

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

Co chcę zrobić, to dostać {{.....etc.....}} rzeczy, które widzę na URL kiedy załadować go w Firefox do mojego skryptu, więc mogę zanalizować wartość z niego. Zrobiłem Google tona, ale nie znalazłem dobrej odpowiedzi na pytanie, jak faktycznie uzyskać rzeczy z {{...}} z adresu URL kończącego się w .json na obiekt w skrypcie Pythona.

Odpowiedz

3

Wszystko, co wywołuje urlopen() powoduje (zgodnie z docs) zwracanie obiektu podobnego do pliku. Gdy już to zrobisz, musisz wywołać jego metodę read(), aby faktycznie pobrać dane JSON przez sieć.

Coś jak:

jsonurl = urlopen(url) 

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

Wezmę przypuszczenie, że rzeczywiście chcesz pobrać dane z adresem URL:

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

Albo, sprawdź JSON decoder w bibliotece requests.

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

+1 za podanie Żądań. – bgporter

169

dane dostać się z adresem URL, a następnie wywołać np json.loads Przykładem

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 

Python3 przykład:

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) 

Wyjście spowodowałoby 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" ] 
     }, 
     { 
... 
+8

Dla Pythona 3+ będziesz musiał "zaimportować urllib.request" – enkash

+16

Zamiast używać 'json.loads', który zużywa ciąg znaków (dlatego też' .read() 'jest wymagany, użyj' json.load (response)) 'zamiast. – awatts

2

Nie ma potrzeby, aby używać dodatkowa biblioteka do parsować json ...

json.loads() zwraca dictionary.

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

12

To dostaje dietę w formacie JSON ze strony internetowej z Pythona 2.x oraz Pythona 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: Read and write example for JSON

+0

@Dereckson Dziękujemy za zgłoszenie tego błędu Naprawiłem to –

7

znalazłem, że jest to najprostszy i najbardziej skuteczny sposób, aby uzyskać JSON ze strony sieci Web przy użyciu Python 3:

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

To nie działa. Musisz zaimportować urlopen z urllib.request, czyli ' from urllib.request import braken' –

2

W Pythonie 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 jest tylko nakładką na json.loads która wywołuje metodę read() dla obiektu podobnego do pliku. json.loads wymaga obiektu typu string, a wyjście urllib.urlopen (url) .read() jest obiektem typu bytes. Musimy pobrać kodowanie plików, aby działało w Pythonie 3.

W tym przykładzie szukamy nagłówków dla kodowania i wracamy do utf-8, jeśli go nie otrzymamy. Obiekt nagłówków różni się między Python 2 i 3, więc trzeba to zrobić na różne sposoby. Używanie tej funkcji pozwoliłoby na uniknięcie 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) 
+0

Znam sześć isn Jest to część standardowej biblioteki, ale jest tu pokazana dla wygody, bez niej potrzebowałbyś bloku if/else lub try/except, który określiłby, gdzie można uzyskać urlopen(). – aviso

Powiązane problemy