পাইথন urllib2: ইউআরএল থেকে জেএসএন প্রতিক্রিয়া পান


90

আমি পাইথন ব্যবহার করে একটি URL পাওয়ার চেষ্টা করছি এবং প্রতিক্রিয়াটি JSON S যাইহোক, আমি যখন চালানো

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

এইচটিএমএল টাইপ টাইপ এবং আমি একটি জেএসএন আশা করছি। আমি কীভাবে কোনও প্রতিক্রিয়া জেএসএন বা একটি অজগর অভিধান হিসাবে স্ট্রিংয়ের পরিবর্তে ক্যাপচার করতে পারি?


4
হয় response.read()একটি বৈধ JSON স্ট্রিংকে ফিরে?
মার্টিজন পিটারস

হ্যাঁ এটি একটি বৈধ জেএসএন স্ট্রিং করে তার ঠিক বা টাইপ করুন এবং ডিক না
দীপক বি

যদি কোনও স্ট্রিংয়ের কোনও JSON উপস্থাপনা না করে বরং কোনও জিনিসের (ডিক) JSON উপস্থাপনের পরিবর্তে, আপনি সার্ভারকে আপনাকে আলাদা আলাদা ডেটা ফিরিয়ে দিতে বাধ্য করতে পারবেন না; আপনার সম্ভবত অন্যরকম অনুরোধ করা দরকার। যদি এটি ঠিক যে আপনি জেএসওএন প্রতিনিধিত্বকে সমতুল্য পাইথন অবজেক্টে পার্স করতে জানেন না তবে মার্টজিন পিটারসের উত্তর সঠিক।
অবধি

উত্তর:


183

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

4
@ ম্যানুয়েলস্কিনিড3আর: উত্তরটি পাইথন 2 এর জন্য, যেখানে থেকে পড়া responseআপনাকে বাইটস্ট্রিং দেয় এবং বাইট্রেস্টিং পড়ার json.load()প্রত্যাশা করে। জেএসএনকে অবশ্যই ইউটিএফ কোডেক ব্যবহার করে এনকোড করতে হবে এবং ইউটিএফ -8, ইউটিএফ -16 এবং ইউটিএফ -32 এর জন্য উপরের কাজগুলি সরবরাহ করবে যদি বিএমও কোডেপয়েন্টটি পরের দুটি কোডেকের জন্য অন্তর্ভুক্ত থাকে। অনুমানগুলির সাথে আপনি যে উত্তরটি যুক্ত করেছেন ইউটিএফ -8 ব্যবহার করা হয়েছিল, এটি সাধারণত সঠিক কারণ এটি ডিফল্ট। পাইথন ৩.6 হিসাবে, jsonজেএসওএন ডেটা সহ গ্রন্থাগারটি অটো-ডিকোড করে একটি ইউটিএফ এনকোডিং ব্যবহৃত হয় provided
মার্টিজন পিটারস

@ ম্যানুয়েলস্কিনিড৩আর: আমি অন্যথায় আপনাকে requestsলাইব্রেরিটি ব্যবহার করার পরামর্শ দিচ্ছি , যা বিওএম অনুপস্থিত রয়েছে এবং প্রতিক্রিয়া শিরোনামে কোনও চরিত্র নির্দিষ্ট করা হয়নি এমন ক্ষেত্রে স্বয়ংক্রিয়ভাবে সঠিক ইউটিএফ কোডেক সনাক্ত করে। শুধু response.json()পদ্ধতিটি ব্যবহার করুন ।
মার্টিজন পিটারস

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 , পাইথন ৩.৪
HTTPMessage এর জন্য , r.info দ্বারা ফিরে ()


4
print dataপাইথন ৩-এর জন্য ভুল হওয়া ছাড়া সলিড কোড be হওয়া উচিত print(data)
ডেভিড মেটকাল্ফ

4
হ্যাঁ এবং লাইন 2 হওয়া উচিত import urllib.request। এছাড়াও, url এ .json ফাইলটি আর বিদ্যমান নেই।
হ্যাক-ট্রাম্প

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

4
হ্যাঁ, যে জেসন.ডম্পস () আমার দিনকে বাঁচিয়েছিল।
লয়েড

জ্যাঙ্গো ১.7+ এর ক্ষেত্রে, আপনি সরাসরি নীচে JsonResponse ব্যবহার করতে পারেন from django.http import JsonResponse return JsonResponse({'key':'value'})
র্যাকুন

4
আমি json.dump () এর পরিবর্তে json.dump () করছিলাম, বোবা অনুভব করছি, সংরক্ষণের জন্য ধন্যবাদ!
হাশির বেগ

4

বৈধতা এবং ইত্যাদি সম্পর্কে সতর্ক থাকুন, তবে সরাসরি সমাধানটি হ'ল:

import json
the_dict = json.load(response)


1

পাইথন 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 () না would হবে। ডোমিন পাস হয়েছে এই ক্ষেত্রে HTTP প্রোটোকল সরবরাহ করা উচিত


0

আপনি requestsনীচের মত ব্যবহার করে জসন পেতে পারেন :

import requests

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

0

এটি আপনার প্রশ্নের আরও সহজ সমাধান

pd.read_json(data)

যেখানে নিম্নলিখিত কোড থেকে ডেটা স্ট্র আউটপুট

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

-1

এখানে প্রদত্ত উদাহরণগুলির মধ্যে কেউই আমার পক্ষে কাজ করেনি। তারা হয় পাইথন 2 (uurllib2) বা পাইথন 3 এর জন্য যারা ত্রুটিটি "ImportError: কোনও মডিউল নামে অনুরোধ করা হয়নি" ফিরিয়ে দেয়। আমি ত্রুটি বার্তাটি গুগল করি এবং এর জন্য সম্ভবত আমার একটি মডিউল ইনস্টল করা দরকার - যা এ জাতীয় সহজ কাজের জন্য স্পষ্টতই অগ্রহণযোগ্য।

এই কোডটি আমার পক্ষে কাজ করেছে:

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

4
আপনি স্পষ্টতই পাইথন ২ ব্যবহার করছেন Py পাইথন ৩-তে কোনও নেই urllib.urlopen; urlopenহয় urllib.requestমডিউল।
নিক মাত্তিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.