Check whether the JSON (object property exists) & print it as unicode decoded
Asked Answered
J

2

22

I get the following data from the Instagram API, I m trying to get the text property from the caption using the following code:

data = simplejson.load(info) # info is retrieved using the urllib2 
    for post in data['data']: 
        if post['caption'] is not "null":
            try:
                post['caption']['text']
            except NameError:
                post['caption']['text'] = 0
            if post['caption']['text'] is not 0:
                print post['caption']['text']

But I keep getting the TypeError: 'NoneType' object has no attribute '__getitem__' error + UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-5: cha racter maps to <undefined> error while printing the unicode strings

Here is the JSON data that is retrieved and stored in info

{
   "pagination":{
      "next_url":"https:\/\/api.instagram.com\/v1\/users\/self\/feed?access_token=184046392.f59def8.c5726b469ad2462f85c7cea5f72083c0&count=3&max_id=247821697921944007_6064449",
      "next_max_id":"247821697921944007_6064449"
   },
   "meta":{
      "code":200
   },
   "data":[
      {
         "attribution":null,
         "tags":[
            "usausausa",
            "olympics"
         ],
         "type":"image",
         "location":{
            "latitude":37.785929,
            "name":"Aquatech Swim School",
            "longitude":-122.278718,
            "id":16343815
         },
         "comments":{
            "count":0,
            "data":[

            ]
         },
         "filter":"Valencia",
         "created_time":"1343765260",
         "link":"http:\/\/instagr.am\/p\/NwhEktJvEp\/",
         "likes":{
            "count":0,
            "data":[

            ]
         },
         "images":{
            "low_resolution":{
               "url":"http:\/\/distilleryimage1.s3.amazonaws.com\/61d9cbeedb4b11e1b8e822000a1e8b8e_6.jpg",
               "width":306,
               "height":306
            },
            "thumbnail":{
               "url":"http:\/\/distilleryimage1.s3.amazonaws.com\/61d9cbeedb4b11e1b8e822000a1e8b8e_5.jpg",
               "width":150,
               "height":150
            },
            "standard_resolution":{
               "url":"http:\/\/distilleryimage1.s3.amazonaws.com\/61d9cbeedb4b11e1b8e822000a1e8b8e_7.jpg",
               "width":612,
               "height":612
            }
         },
         "caption":{
            "created_time":"1343765325",
            "text":"Part of my job to watch swimming. #olympics #USAUSAUSA",
            "from":{
               "username":"kissinkatkelly",
               "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_4672491_75sq_1341713095.jpg",
               "id":"4672491",
               "full_name":"kissinkatkelly"
            },
            "id":"247843973390332239"
         },
         "user_has_liked":false,
         "id":"247843429330383145_4672491",
         "user":{
            "username":"kissinkatkelly",
            "website":"",
            "bio":"I sing the body electric\r\n\r\nBay Area, CA",
            "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_4672491_75sq_1341713095.jpg",
            "full_name":"kissinkatkelly",
            "id":"4672491"
         }
      },
      {
         "attribution":null,
         "tags":[

         ],
         "type":"image",
         "location":{
            "latitude":36.020832061,
            "longitude":-121.548835754
         },
         "comments":{
            "count":4,
            "data":[
               {
                  "created_time":"1343763343",
                  "text":"I wanna cut your mustache off. \ue313\ue313\ue313\ue004",
                  "from":{
                     "username":"glorias_noodles",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_24432017_75sq_1343633079.jpg",
                     "id":"24432017",
                     "full_name":"\ue340MeGusta Gloria\ue340"
                  },
                  "id":"247827343962686703"
               },
               {
                  "created_time":"1343763844",
                  "text":"Ahaha^",
                  "from":{
                     "username":"chloe_carter",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_44766575_75sq_1343509145.jpg",
                     "id":"44766575",
                     "full_name":"Chloe Carter"
                  },
                  "id":"247831551235474746"
               },
               {
                  "created_time":"1343763958",
                  "text":"Amazingg thoo",
                  "from":{
                     "username":"saulyp",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_18051263_75sq_1335648741.jpg",
                     "id":"18051263",
                     "full_name":"Saul Perez"
                  },
                  "id":"247832506790200642"
               },
               {
                  "created_time":"1343764298",
                  "text":"@popesaintvictor where is that? :o",
                  "from":{
                     "username":"youknow_jameson",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_194001394_75sq_1343613135.jpg",
                     "id":"194001394",
                     "full_name":"Jameson Medina"
                  },
                  "id":"247835358103225704"
               }
            ]
         },
         "filter":"Normal",
         "created_time":"1343763202",
         "link":"http:\/\/instagr.am\/p\/NwdJRpBkfX\/",
         "likes":{
            "count":611,
            "data":[
               {
                  "username":"jakyvedder",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_18148021_75sq_1336938690.jpg",
                  "id":"18148021",
                  "full_name":"Janycken"
               },
               {
                  "username":"nadjasinbruker",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_174576513_75sq_1343582260.jpg",
                  "id":"174576513",
                  "full_name":"Nadja"
               },
               {
                  "username":"vivi11",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_1193390_75sq_1338169730.jpg",
                  "id":"1193390",
                  "full_name":"Viviana Rodriguez"
               },
               {
                  "username":"me_4_eva",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_181498114_75sq_1343506811.jpg",
                  "id":"181498114",
                  "full_name":"Kelly"
               },
               {
                  "username":"roxczajkowski",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_9367244_75sq_1343696914.jpg",
                  "id":"9367244",
                  "full_name":"Czajkowski \u041a\u043e\u0440\u0448\u0443\u043d\u043e\u0432\u0430"
               },
               {
                  "username":"arsi1989",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_201586134_75sq_1343761866.jpg",
                  "id":"201586134",
                  "full_name":"Arsalan MemOn"
               },
               {
                  "username":"puppyluva",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_201579504_75sq_1343760137.jpg",
                  "id":"201579504",
                  "full_name":"puppyluva"
               },
               {
                  "username":"paulinamurr",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_49364097_75sq_1343428499.jpg",
                  "id":"49364097",
                  "full_name":"Paulina Murray"
               },
               {
                  "username":"_mcquadeface_",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_20679753_75sq_1327617901.jpg",
                  "id":"20679753",
                  "full_name":"Emily McQuade"
               }
            ]
         },
         "images":{
            "low_resolution":{
               "url":"http:\/\/distilleryimage11.s3.amazonaws.com\/96cd5b90db4611e1827612313814176c_6.jpg",
               "width":306,
               "height":306
            },
            "thumbnail":{
               "url":"http:\/\/distilleryimage11.s3.amazonaws.com\/96cd5b90db4611e1827612313814176c_5.jpg",
               "width":150,
               "height":150
            },
            "standard_resolution":{
               "url":"http:\/\/distilleryimage11.s3.amazonaws.com\/96cd5b90db4611e1827612313814176c_7.jpg",
               "width":612,
               "height":612
            }
         },
         "caption":null,
         "user_has_liked":false,
         "id":"247826160271378391_605400",
         "user":{
            "username":"popesaintvictor",
            "website":"http:\/\/popesaintvictor.com",
            "bio":"artist, friend, and brand designer for blood:water mission in nashville, tennessee. \r\n\r\nhusband to @ohsoamy\r\n\r\nbe inspired. be awesome.\r\n",
            "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_605400_75sq_1342893414.jpg",
            "full_name":"pope saint victor",
            "id":"605400"
         }
      },
      {
         "attribution":null,
         "tags":[

         ],
         "type":"image",
         "location":{
            "latitude":40.738834381,
            "longitude":-73.994163513
         },
         "comments":{
            "count":6,
            "data":[
               {
                  "created_time":"1343762733",
                  "text":"Nice :)",
                  "from":{
                     "username":"belieberpernille99",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_186196238_75sq_1341347304.jpg",
                     "id":"186196238",
                     "full_name":"official belieber"
                  },
                  "id":"247822232418879860"
               },
               {
                  "created_time":"1343762748",
                  "text":"Those pants \ud83d\ude0d",
                  "from":{
                     "username":"morganmarzulli",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_29155556_75sq_1337653621.jpg",
                     "id":"29155556",
                     "full_name":"morganmarzulli"
                  },
                  "id":"247822351461615990"
               },
               {
                  "created_time":"1343762777",
                  "text":"That outfit is to die for. I love her pants! They're so fun. \ud83d\udc4d",
                  "from":{
                     "username":"ninavnegron",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_18421926_75sq_1343356820.jpg",
                     "id":"18421926",
                     "full_name":"Nina V"
                  },
                  "id":"247822600452278654"
               },
               {
                  "created_time":"1343762782",
                  "text":"YEAH THEIR COOL",
                  "from":{
                     "username":"belieberpernille99",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_186196238_75sq_1341347304.jpg",
                     "id":"186196238",
                     "full_name":"official belieber"
                  },
                  "id":"247822639375419775"
               },
               {
                  "created_time":"1343762782",
                  "text":"Another day another shoot! Look out for me and my chicest staff on @racked!",
                  "from":{
                     "username":"rebeccaminkoff",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_6064449_75sq_1332274636.jpg",
                     "id":"6064449",
                     "full_name":"Rebecca Minkoff"
                  },
                  "id":"247822641497737600"
               },
               {
                  "created_time":"1343764430",
                  "text":"Hot mama! Miss you!",
                  "from":{
                     "username":"ashleekoston",
                     "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_12925089_75sq_1340081366.jpg",
                     "id":"12925089",
                     "full_name":"ashleekoston"
                  },
                  "id":"247836463642020446"
               }
            ]
         },
         "filter":"Walden",
         "created_time":"1343762670",
         "link":"http:\/\/instagr.am\/p\/NwcIVwRYnH\/",
         "likes":{
            "count":528,
            "data":[
               {
                  "username":"claireyoung48",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_40091175_75sq_1338778945.jpg",
                  "id":"40091175",
                  "full_name":"claireyoung48"
               },
               {
                  "username":"l_christine_k",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_14871166_75sq_1341962995.jpg",
                  "id":"14871166",
                  "full_name":"Lauren Kawano"
               },
               {
                  "username":"grcdaly",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_41426567_75sq_1335023058.jpg",
                  "id":"41426567",
                  "full_name":"\u24bc\u24c7\u24b6\u24b8\u24ba \u24b9\u24b6\u24c1\u24e8"
               },
               {
                  "username":"vanessaalcalaa",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_18115905_75sq_1342828120.jpg",
                  "id":"18115905",
                  "full_name":"Vanessa Alcala"
               },
               {
                  "username":"makennalenover",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_6464394_75sq_1343268613.jpg",
                  "id":"6464394",
                  "full_name":"Makenna Lenover"
               },
               {
                  "username":"heyitsmaryanne",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_623979_75sq_1340838647.jpg",
                  "id":"623979",
                  "full_name":"Maryanne L"
               },
               {
                  "username":"sarabeen",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/anonymousUser.jpg",
                  "id":"6463387",
                  "full_name":"sarabeen"
               },
               {
                  "username":"boldincrimson",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_191122242_75sq_1341889110.jpg",
                  "id":"191122242",
                  "full_name":"Pilar Chapa"
               },
               {
                  "username":"elizzabethhope",
                  "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_6761399_75sq_1342553102.jpg",
                  "id":"6761399",
                  "full_name":"Lizz\u270c"
               }
            ]
         },
         "images":{
            "low_resolution":{
               "url":"http:\/\/distilleryimage7.s3.amazonaws.com\/59bc708edb4511e1b7ea22000a1cbb16_6.jpg",
               "width":306,
               "height":306
            },
            "thumbnail":{
               "url":"http:\/\/distilleryimage7.s3.amazonaws.com\/59bc708edb4511e1b7ea22000a1cbb16_5.jpg",
               "width":150,
               "height":150
            },
            "standard_resolution":{
               "url":"http:\/\/distilleryimage7.s3.amazonaws.com\/59bc708edb4511e1b7ea22000a1cbb16_7.jpg",
               "width":612,
               "height":612
            }
         },
         "caption":null,
         "user_has_liked":false,
         "id":"247821697921944007_6064449",
         "user":{
            "username":"rebeccaminkoff",
            "website":"http:\/\/www.rebeccaminkoff.com",
            "bio":"The Downtown Romantic. My life, my work, my world.",
            "profile_picture":"http:\/\/images.instagram.com\/profiles\/profile_6064449_75sq_1332274636.jpg",
            "full_name":"Rebecca Minkoff",
            "id":"6064449"
         }
      }
   ]
}
Jacket answered 31/7, 2012 at 20:13 Comment(5)
if post['caption'] is not 'null': Did you mean to check for the string 'null', made of 4 characters, or for None?Snowy
yep !! I m checking whether or not the post['caption'] exists or notJacket
Yes, you want to check if it's None, not the string null. When Python decodes JSON, it turns null into it's null object, which is None. Not the string 'null'. In JSON that would look like "null", not nullSnowy
so how exactly should I check whether it is a None object or not?? Along with the text whether it exists or not!Jacket
While the methods below are nicer, but for your specific question: if x is None: checks if something is None. if x: checks if it's a true value. None, False, empty strings, empty dictionaries, empty arrays, and 0 are considered false values.Snowy
R
30

You don't need the intricate tests on wether 'text' is present for the post caption. This code works well with the JSON string you posted:

for post in data['data']:
    if post.get('caption'):
        print post['caption'].get('text', 0)

Furthermore, you could be more defensive and refer to data.get('data', []) when starting the loop in case Instagram sends you empty JSON.

Rhizo answered 31/7, 2012 at 20:39 Comment(4)
Well thanks for your answer, but I m still getting this error UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-1: cha racter maps to <undefined> while printing the text since some of them contain unicode!Jacket
try setting your environment charset as UTF8, or decode info like this: data = simplejson.load(info.decode('utf-8'))Rhizo
decode info doesnt seem to work using the second method, getting AttributeError: dict has no attribute 'decode'Jacket
sorry, was assuming the info object you obtained from Instagram was a string. How does it work with simplejson.loads if it's a dictionary? Are you sure you used the code from my comment right?Rhizo
N
14

Basically when json loads and deserializes your object, null in JSON will become None in python.

So your line of:

if post['caption'] is not 'null':

Should become:

if post['caption']:

Nympho answered 31/7, 2012 at 20:33 Comment(3)
And how exactly should I check whether the post['caption']['text'] exists or not ??Jacket
if 'text' in post['caption'].keys(): would be one option.Nympho
.keys() is reundant. if 'text' in post['caption'] is sufficient. in by default checks the keys.Snowy

© 2022 - 2024 — McMap. All rights reserved.