Python urllib2: รับการตอบสนอง JSON จาก url


91

ฉันพยายามรับ URL โดยใช้ Python และคำตอบคือ JSON อย่างไรก็ตามเมื่อฉันวิ่ง

import urllib2
response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
html=response.read()
print html

html เป็นประเภท str และฉันต้องการ JSON มีวิธีใดบ้างที่ฉันสามารถจับการตอบสนองเป็น JSON หรือพจนานุกรม python แทน str


1
กำลังresponse.read()ส่งคืนสตริง JSON ที่ถูกต้องหรือไม่
Martijn Pieters

ใช่สตริง JSON ที่ถูกต้องเป็นเพียงหรือพิมพ์ str และ not dict
Deepak B

หากเป็นการแสดงสตริง JSON แทนการแทนค่า JSON ของอ็อบเจ็กต์ (dict) คุณไม่สามารถบังคับให้เซิร์ฟเวอร์ส่งคืนข้อมูลอื่นให้คุณได้ คุณอาจต้องส่งคำขออื่น หากคุณไม่ทราบวิธีแยกวิเคราะห์การแสดง JSON ในวัตถุ Python ที่เทียบเท่าคำตอบของ Martjin Pieters นั้นถูกต้อง
ยกเลิก

คำตอบ:


184

หาก URL ส่งคืนข้อมูลที่เข้ารหัส JSON ที่ถูกต้องให้ใช้jsonไลบรารีเพื่อถอดรหัสว่า:

import urllib2
import json

response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
data = json.load(response)   
print data

1
@ ManuelSchneid3r: คำตอบสำหรับ Python 2 ซึ่งการอ่านจากresponseจะช่วยให้คุณมีการทดสอบ bytestrings และjson.load()คาดว่าจะอ่าน bytestring ต้องเข้ารหัสJSON โดยใช้ตัวแปลงสัญญาณ UTF และข้างต้นใช้งานได้กับ UTF-8, UTF-16 และ UTF-32 โดยมีจุดรหัส BOM รวมอยู่สำหรับตัวแปลงสัญญาณสองตัวหลัง คำตอบที่คุณเชื่อมโยงเพื่อสันนิษฐานว่า UTF-8 ถูกใช้ซึ่งโดยปกติจะถูกต้องเนื่องจากเป็นค่าเริ่มต้น ใน Python 3.6 jsonไลบรารีจะถอดรหัส bytecodes โดยอัตโนมัติด้วยข้อมูล JSON ที่มีการใช้การเข้ารหัส UTF
Martijn Pieters

@ ManuelSchneid3r: ฉันขอแนะนำให้คุณใช้requestsไลบรารีซึ่งจะตรวจจับตัวแปลงสัญญาณ UTF ที่ถูกต้องโดยอัตโนมัติเพื่อใช้ในกรณีที่ BOM ขาดหายไปและไม่มีการระบุชุดอักขระในส่วนหัวการตอบกลับ เพียงแค่ใช้response.json()วิธี
Martijn Pieters

35
import json
import urllib

url = 'http://example.com/file.json'
r = urllib.request.urlopen(url)
data = json.loads(r.read().decode(r.info().get_param('charset') or 'utf-8'))
print(data)

urllibสำหรับ Python 3.4
HTTPMessageส่งคืนโดย r.info ()


1
รหัสของแข็งอื่น ๆ กว่าprint dataเป็นไม่ถูกต้องสำหรับหลาม 3. print(data)ควรจะเป็น
David Metcalfe

1
ใช่และบรรทัดที่ 2 import urllib.requestควรจะเป็น นอกจากนี้ไฟล์. json ใน url ก็ไม่มีอยู่แล้ว
hack-tramp

5
"""
Return JSON to webpage
Adding to wonderful answer by @Sanal
For Django 3.4
Adding a working url that returns a json (Source: http://www.jsontest.com/#echo)
"""

import json
import urllib

url = 'http://echo.jsontest.com/insert-key-here/insert-value-here/key/value'
respons = urllib.request.urlopen(url)
data = json.loads(respons.read().decode(respons.info().get_param('charset') or 'utf-8'))
return HttpResponse(json.dumps(data), content_type="application/json")

1
ว้าว json.dumps () ช่วยวันของฉัน
Lloyd

ในกรณีของ Django 1.7 + คุณสามารถใช้ JsonResponse ได้โดยตรงดังต่อไปนี้ from django.http import JsonResponse return JsonResponse({'key':'value'})
raccoon

1
ฉันกำลังทำ json.dump () แทน json.dumps () รู้สึกโง่ขอบคุณสำหรับการบันทึก!
Hashir Baig

4

ระมัดระวังเกี่ยวกับการตรวจสอบความถูกต้องและอื่น ๆ แต่วิธีแก้ปัญหาที่ตรงคือ:

import json
the_dict = json.load(response)


1

Python 3 ไลบรารีมาตรฐานหนึ่งซับ:

load(urlopen(url))

# imports (place these above the code before running it)
from json import load
from urllib.request import urlopen
url = 'https://jsonplaceholder.typicode.com/todos/1'

0

แม้ว่าฉันเดาว่ามันได้รับคำตอบแล้ว แต่ฉันก็อยากจะเพิ่มเล็กน้อยในนี้

import json
import urllib2
class Website(object):
    def __init__(self,name):
        self.name = name 
    def dump(self):
     self.data= urllib2.urlopen(self.name)
     return self.data

    def convJSON(self):
         data=  json.load(self.dump())
     print data

domain = Website("https://example.com")
domain.convJSON()

หมายเหตุ: อ็อบเจ็กต์ที่ส่งไปยังjson.load ()ควรสนับสนุน . read ()ดังนั้นurllib2.urlopen (self.name) .read ()จะไม่ทำงาน Doamin ผ่านควรจัดเตรียมโปรโตคอลในกรณีนี้http


0

คุณสามารถรับ json ได้โดยใช้requestsด้านล่าง:

import requests

r = requests.get('http://yoursite.com/your-json-pfile.json')
json_response = r.json()

0

นี่เป็นอีกวิธีหนึ่งที่ง่ายกว่าสำหรับคำถามของคุณ

pd.read_json(data)

โดยที่ข้อมูลเป็นเอาต์พุต str จากรหัสต่อไปนี้

response = urlopen("https://data.nasa.gov/resource/y77d-th95.json")
json_data = response.read().decode('utf-8', 'replace')

-1

ไม่มีตัวอย่างใดที่ให้ไว้ในที่นี้ได้ผลสำหรับฉัน ทั้งสำหรับ Python 2 (uurllib2) หรือ Python 3 ส่งคืนข้อผิดพลาด "ImportError: No module named request" ฉัน Google ข้อความแสดงข้อผิดพลาดและเห็นได้ชัดว่าต้องการให้ฉันติดตั้งโมดูลซึ่งเป็นที่ยอมรับไม่ได้สำหรับงานง่ายๆเช่นนี้

รหัสนี้ใช้ได้กับฉัน:

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

2
เห็นได้ชัดว่าคุณใช้ Python 2 ใน Python 3 ไม่มีurllib.urlopen; urlopenอยู่ในurllib.requestโมดูล
Nick Matteo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.