Check whether the JSON (object property exists) & print it as unicode decoded
-
23-06-2021 - |
题
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"
}
}
]
}
解决方案
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.
其他提示
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']: