วิธีรับ JSON จากหน้าเว็บเป็นสคริปต์ Python


193

รับรหัสต่อไปนี้ในหนึ่งในสคริปต์ของฉัน:

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

สิ่งที่ฉันต้องการทำคือนำ{{.....etc.....}}สิ่งที่ฉันเห็นใน URL เมื่อฉันโหลดใน Firefox ลงในสคริปต์ของฉันเพื่อให้ฉันสามารถแยกค่าออกจากมัน ฉันใช้ Google ได้ดี แต่ฉันไม่พบคำตอบที่ดีเกี่ยวกับวิธีการรับ{{...}}สิ่งของจาก URL ที่ลงท้ายด้วย.jsonวัตถุในสคริปต์ Python

คำตอบ:


316

รับข้อมูลจาก URL จากนั้นโทรjson.loadsเช่น

ตัวอย่าง 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)

ตัวอย่าง 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

ผลลัพธ์จะเป็นดังนี้:

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

30
แทนที่จะใช้json.loadsซึ่งใช้การใช้สตริง (ซึ่งเป็นเหตุผลที่.read()จำเป็นต้องใช้json.load(response)แทน
awatts

PSL เท่านั้นรัดกุมและมีประสิทธิภาพ
jlandercy

เป็นที่urllib2นิยมใน Python2 หรือไม่
Jon-Eric

110

ฉันจะเดาว่าคุณต้องการรับข้อมูลจาก URL จริง:

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

หรือตรวจสอบตัวถอดรหัส JSONในไลบรารีคำขอ

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

สมควรได้รับตราสีเขียวสำหรับคำถามนี้! ขอบคุณ!
Aziz Alto

27

สิ่งนี้รับพจนานุกรมในรูปแบบ JSON จากเว็บเพจที่มี Python 2.X และ 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))

ดูเพิ่มเติม: อ่านและเขียนตัวอย่างสำหรับ JSON


24

ฉันพบว่านี่เป็นวิธีที่ง่ายและมีประสิทธิภาพมากที่สุดในการรับ JSON จากหน้าเว็บเมื่อใช้ 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
มันใช้งานไม่ได้ คุณต้องนำเข้า urlopen จาก urllib.request เช่นfrom urllib.request import urlopen
Dawid Laszuk

5

สิ่งที่การเรียกร้องให้urlopen()ทำ (ตามเอกสาร ) จะส่งคืนวัตถุที่มีลักษณะเหมือนไฟล์ เมื่อคุณมีแล้วคุณจะต้องเรียกread()ใช้วิธีการเพื่อดึงข้อมูล JSON ทั่วทั้งเครือข่าย

สิ่งที่ต้องการ:

jsonurl = urlopen(url)

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

5

ใน Python 2, json.load () จะทำงานแทน json.loads ()

import json
import urllib

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

น่าเสียดายที่มันใช้ไม่ได้กับ Python 3 json.load เป็นเพียง wrapper รอบ ๆ json.loads ที่เรียก read () สำหรับวัตถุที่คล้ายไฟล์ json.loads ต้องการวัตถุสตริงและผลลัพธ์ของ urllib.urlopen (url) .read () เป็นวัตถุไบต์ ดังนั้นหนึ่งจะต้องได้รับการเข้ารหัสไฟล์เพื่อให้มันทำงานใน Python 3

ในตัวอย่างนี้เราสอบถามส่วนหัวสำหรับการเข้ารหัสและถอยกลับไปที่ utf-8 หากเราไม่ได้รับ วัตถุส่วนหัวแตกต่างกันระหว่าง Python 2 และ 3 ดังนั้นจึงจำเป็นต้องทำวิธีที่แตกต่างกัน การใช้คำร้องขอจะหลีกเลี่ยงสิ่งเหล่านี้ทั้งหมด แต่บางครั้งคุณต้องติดกับไลบรารีมาตรฐาน

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)

ฉันรู้ว่าหกคนไม่ได้เป็นส่วนหนึ่งของห้องสมุดมาตรฐานเช่นกัน แต่มันแสดงไว้ที่นี่เพื่อความสะดวก หากไม่มีคุณจะต้องใช้ if / else หรือลอง / ยกเว้น block เพื่อกำหนดว่าจะรับ urlopen ได้ที่ไหน ()
aviso

3

ไม่จำเป็นต้องใช้ห้องสมุดเพิ่มเติมเพื่อแยกวิเคราะห์ json ...

json.loads()ส่งกลับพจนานุกรม

ดังนั้นในกรณีของคุณเพียงแค่ทำ text["someValueKey"]


3

ตอบรับล่าช้า แต่python>=3.6คุณสามารถใช้:

import dload
j = dload.json(url)

ติดตั้งdloadด้วย:

pip3 install dload

-1

คุณสามารถใช้json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

สำหรับการโหลด json และเขียนลงในไฟล์รหัสต่อไปนี้มีประโยชน์:

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.