পাইথন 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.