الحصول على بيانات سلمان عبر رابط واستخدامها في بيثون (simplejson)

StackOverflow https://stackoverflow.com/questions/1640715

سؤال

وأتصور هذا يجب أن يكون الجواب بسيط، ولكن أنا تكافح: وأود أن أغتنم رابط (الذي النواتج سلمان) والحصول على البيانات في القاموس صالحة للاستعمال في بيثون. أنا عالقة على الخطوة الأخيرة.

>>> import urllib2
>>> import simplejson
>>> req = urllib2.Request("http://vimeo.com/api/v2/video/38356.json", None, {'user-agent':'syncstream/vimeo'})
>>> opener = urllib2.build_opener()
>>> f = opener.open(req)
>>> f.read()             # this works
'[{"id":"38356","title":"Forgetfulness - Billy Collins Animated Poetry","description":"US Poet Laureate Billy Collins reads his poem ","url":"http:\\/\\/vimeo.com\\/38356","upload_date":"2006-01-24 15:21:03","thumbnail_small":"http:\\/\\/80.media.vimeo.com\\/d1\\/5\\/47\\/74\\/thumbnail-4774968.jpg","thumbnail_medium":"http:\\/\\/80.media.vimeo.com\\/d1\\/5\\/46\\/85\\/thumbnail-4685118.jpg","thumbnail_large":"http:\\/\\/images.vimeo.com\\/87\\/39\\/873998\\/873998_640x480.jpg","user_name":"smjwt","user_url":"http:\\/\\/vimeo.com\\/smjwt","user_portrait_small":"http:\\/\\/bitcast.vimeo.com\\/vimeo\\/portraits\\/defaults\\/d.30.jpg","user_portrait_medium":"http:\\/\\/bitcast.vimeo.com\\/vimeo\\/portraits\\/defaults\\/d.75.jpg","user_portrait_large":"http:\\/\\/bitcast.vimeo.com\\/vimeo\\/portraits\\/defaults\\/d.100.jpg","user_portrait_huge":"http:\\/\\/bitcast.vimeo.com\\/vimeo\\/portraits\\/defaults\\/d.300.jpg","stats_number_of_likes":"281","stats_number_of_plays":"9173","stats_number_of_comments":23,"duration":"112","width":"320","height":"240","tags":"poetry, poet, online poetry, famous poet, video poetry, modern poetry, famous poem, poetry sites, poetry websites, audio poetry, american poet, animation clips, american poetry, free poetry sites, animation art, free poetry, animated clips, poem, poet laureate"}]'
>>> simplejson.load(f)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.5/site-packages/django/utils/simplejson/__init__.py", line 298, in load
    parse_constant=parse_constant, **kw)
  File "/usr/lib/python2.5/site-packages/django/utils/simplejson/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.5/site-packages/django/utils/simplejson/decoder.py", line 326, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.5/site-packages/django/utils/simplejson/decoder.py", line 344, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

وأي أفكار أين أنا ذاهب خاطئة؟

هل كانت مفيدة؟

المحلول

وحاول

f = opener.open(req)
simplejson.load(f)

ودون تشغيل f.read () أولا. عند تشغيل f.read ()، وslurped محتويات filehandle بحيث لم يبق شيء عندما simplejson.load(f) مكالمتك

نصائح أخرى

والسطر الأول يقرأ الملف بأكمله. السطر الثاني ثم يحاول قراءة أكثر من ملف، ولكن لا يوجد شيء اليسار:

>>> f.read()             # this works
blah blah blah
>>> simplejson.load(f)

وإما مجرد حذف f.read () خط، أو حفظ القيمة من القراءة، واستخدامه في الأحمال:

json = f.read()
simplejson.loads(json)

وهناك طريقة أسهل - لا تحتاج simplejson على الإطلاق. بيثون يمكن تحليل سلمان إلى ديكت / مجموعة باستخدام عبارة وحدة التقييم طالما قمت بتعيين صحيح / خطأ / فارغة إلى القيم الصحيحة.

# fetch the url
url = "https://api.twitter.com/1/users/lookup.json?user_id=6253282,18949452"
json = urllib2.urlopen(url).read()

# convert to a native python object
(true,false,null) = (True,False,None)
profiles = eval(json)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top