Cách nhận JSON từ trang web vào tập lệnh Python


191

Có mã sau đây trong một trong các tập lệnh của tôi:

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

Những gì tôi muốn làm là lấy những {{.....etc.....}}thứ tôi thấy trên URL khi tôi tải nó trong Firefox vào tập lệnh của mình để tôi có thể phân tích một giá trị ra khỏi nó. Tôi đã googled một tấn nhưng tôi chưa tìm thấy câu trả lời hay về cách thực sự lấy {{...}}nội dung từ một URL kết thúc .jsonvào một đối tượng trong tập lệnh Python.

Câu trả lời:


313

Nhận dữ liệu từ URL và sau đó gọi, json.loadsvd

Ví dụ về 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)

Ví dụ về 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

Đầu ra sẽ dẫn đến một cái gì đó như thế này:

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

29
Thay vì sử dụng json.loadstiêu thụ một chuỗi sử dụng (đó là lý do tại sao .read()bắt buộc, json.load(response)thay vào đó hãy sử dụng .
đánh giá

Chỉ PSL, ngắn gọn và hiệu quả
jlandercy

Được urllib2ưa thích hơn trong Python2?
Jon-Eric

110

Tôi sẽ đoán rằng bạn thực sự muốn lấy dữ liệu từ URL:

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

Hoặc, kiểm tra bộ giải mã JSON trong thư viện yêu cầu .

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

xứng đáng với huy hiệu xanh cho câu hỏi này! cảm ơn!
Aziz Alto

27

Điều này nhận được một từ điển ở định dạng JSON từ một trang web với Python 2.X và 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))

Xem thêm: Đọc và viết ví dụ cho JSON


24

Tôi đã thấy đây là cách dễ nhất và hiệu quả nhất để lấy JSON từ trang web khi sử dụng 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
Điều này không hoạt động. Bạn cần nhập urlopen từ urllib.request, tức làfrom urllib.request import urlopen
Dawid Laszuk

5

Tất cả những gì mà lệnh gọi urlopen()thực hiện (theo các tài liệu ) sẽ trả về một đối tượng giống như tệp. Một khi bạn có điều đó, bạn cần phải gọi nóread() phương thức để thực sự kéo dữ liệu JSON trên mạng.

Cái gì đó như:

jsonurl = urlopen(url)

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

5

Trong Python 2, json.load () sẽ hoạt động thay vì json.loads ()

import json
import urllib

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

Thật không may, điều đó không hoạt động trong Python 3. json.load chỉ là một trình bao bọc xung quanh json.loads gọi read () cho một đối tượng giống như tệp. json.loads yêu cầu một đối tượng chuỗi và đầu ra của urllib.urlopen (url) .read () là một đối tượng byte. Vì vậy, người ta phải lấy mã hóa tệp để làm cho nó hoạt động trong Python 3.

Trong ví dụ này, chúng tôi truy vấn các tiêu đề để mã hóa và quay lại utf-8 nếu chúng tôi không nhận được. Đối tượng tiêu đề khác nhau giữa Python 2 và 3 vì vậy nó phải được thực hiện theo những cách khác nhau. Sử dụng các yêu cầu sẽ tránh tất cả điều này, nhưng đôi khi bạn cần phải bám vào thư viện tiêu chuẩn.

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)

Tôi biết sáu không phải là một phần của thư viện tiêu chuẩn, nhưng nó được hiển thị ở đây để thuận tiện. Nếu không có nó, bạn cần một if / khác hoặc thử / ngoại trừ khối để xác định nơi nhận urlopen ().
aviso


3

Câu trả lời muộn, nhưng đối với python>=3.6bạn có thể sử dụng:

import dload
j = dload.json(url)

Cài đặt dloadvới:

pip3 install dload

-1

bạn có thể sử dụng json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

để tải json và ghi nó vào tệp, đoạn mã sau rất hữu ích:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.