Cara mendapatkan JSON dari halaman web ke dalam skrip Python

193

Dapatkan kode berikut di salah satu skrip saya:

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

Yang ingin saya lakukan adalah mendapatkan {{.....etc.....}}hal - hal yang saya lihat di URL ketika saya memuatnya di Firefox ke dalam skrip saya sehingga saya dapat mengurai nilai dari itu. Saya telah mencari di Google satu ton, tetapi saya belum menemukan jawaban yang bagus tentang bagaimana sebenarnya mendapatkan {{...}}barang - barang dari URL yang berakhir .jsondengan objek dalam skrip Python.

Chris B
sumber

Jawaban:

316

Dapatkan data dari URL dan kemudian hubungi json.loadsmis

Contoh 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)

Contoh 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

Output akan menghasilkan sesuatu seperti ini:

{
"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
sumber
30
Daripada menggunakan json.loadsyang mengkonsumsi penggunaan string (itulah sebabnya .read()diperlukan, gunakan json.load(response)sebagai gantinya.
awatts
Hanya PSL, ringkas dan efisien
jlandercy
Apakah urllib2lebih disukai di Python2?
Jon-Eric
110

Saya akan menebak bahwa Anda sebenarnya ingin mendapatkan data dari URL:

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

Atau, periksa dekoder JSON di pustaka permintaan .

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
sumber
layak mendapat lencana hijau untuk pertanyaan ini! Terima kasih!
Aziz Alto
27

Ini mendapatkan kamus dalam format JSON dari halaman web dengan Python 2.X dan 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))

Lihat juga: Baca dan tulis contoh untuk JSON

Martin Thoma
sumber
24

Saya telah menemukan ini sebagai cara termudah dan paling efisien untuk mendapatkan JSON dari halaman web saat menggunakan Python 3:

import json,urllib.request
data = urllib.request.urlopen("https://api.github.com/users?since=100").read()
output = json.loads(data)
print (output)
Uxbridge
sumber
4
Ini tidak berhasil. Anda perlu mengimpor urlopen dari urllib.request, yaitufrom urllib.request import urlopen
Dawid Laszuk
5

Semua yang dilakukan oleh panggilan urlopen()(sesuai dengan dokumen ) adalah mengembalikan objek seperti file. Setelah memilikinya, Anda perlu memanggil read()metode untuk benar-benar menarik data JSON di seluruh jaringan.

Sesuatu seperti:

jsonurl = urlopen(url)

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

Dalam Python 2, json.load () akan berfungsi sebagai ganti json.loads ()

import json
import urllib

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

Sayangnya, itu tidak berfungsi di Python 3. json.load hanyalah pembungkus di sekitar json.loads yang memanggil read () untuk objek seperti file. json.loads memerlukan objek string dan output dari urllib.urlopen (url) .read () adalah objek byte. Jadi kita harus mendapatkan pengkodean file untuk membuatnya bekerja di Python 3.

Dalam contoh ini kita akan menanyakan header untuk pengkodean dan kembali ke utf-8 jika kita tidak mendapatkannya. Objek header berbeda antara Python 2 dan 3 sehingga harus dilakukan dengan cara yang berbeda. Menggunakan permintaan akan menghindari semua ini, tetapi kadang-kadang Anda harus tetap menggunakan perpustakaan standar.

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
sumber
Saya tahu enam juga bukan bagian dari perpustakaan standar, tetapi ditampilkan di sini untuk kenyamanan. Tanpa itu, Anda memerlukan blok if / else atau try / kecuali untuk menentukan di mana mendapatkan urlopen ().
aviso
3

Tidak perlu menggunakan perpustakaan tambahan untuk mem-parsing json ...

json.loads()mengembalikan kamus .

Jadi dalam kasus Anda, lakukan saja text["someValueKey"]

laboratorium posit
sumber
3

Jawaban terlambat, tetapi untuk python>=3.6Anda dapat menggunakan:

import dload
j = dload.json(url)

Instal dloaddengan:

pip3 install dload
HUBUNGI19
sumber
0

yang Anda butuhkan import requestsdan gunakan dari metode json ():

source = requests.get("url").json()
print(source)

Tentu saja, metode ini juga berfungsi:

import json,urllib.request
data = urllib.request.urlopen("url").read()
output = json.loads(data)
print (output)
mamal
sumber
-1

Anda bisa menggunakan json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

untuk memuat json dan menuliskannya di file, kode berikut berguna:

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
sumber