返されたjsonには投稿があり、フィールド(したがってmedia=null
フィールド)はありpost['data']['media']
ません:oembed
url
{
"kind" : "t3",
"data" : {
"downs" : 24050,
"link_flair_text" : null,
"media" : null,
"url" : "http://youtu.be/aNJgX3qH148?t=4m20s",
"link_flair_css_class" : null,
"id" : "rymif",
"edited" : false,
"num_reports" : null,
"created_utc" : 1333847562,
"banned_by" : null,
"name" : "t3_rymif",
"subreddit" : "videos",
"title" : "An awesome young man",
"author_flair_text" : null,
"is_self" : false,
"author" : "Lostinfrustration",
"media_embed" : {},
"permalink" : "/r/videos/comments/rymif/an_awesome_young_man/",
"author_flair_css_class" : null,
"selftext" : "",
"domain" : "youtu.be",
"num_comments" : 2260,
"likes" : null,
"clicked" : false,
"thumbnail" : "http://a.thumbs.redditmedia.com/xUDtCtRFDRAP5gQr.jpg",
"saved" : false,
"ups" : 32312,
"subreddit_id" : "t5_2qh1e",
"approved_by" : null,
"score" : 8262,
"selftext_html" : null,
"created" : 1333847562,
"hidden" : false,
"over_18" : false
}
},
また、例外メッセージが実際には適合していないようです。urlopen
たとえば、爆発したときにスローされる可能性のある例外にはさまざまな種類がありますIOError
。エラーメッセージが示すように、返された形式が有効なJSONであるかどうかはチェックされません。
ここで、問題を軽減するために、を確認する必要があります"oembed" in post['data']['media']
。それが可能である場合にのみ、すべてのblobが持ってpost['data']['media']['oembed']['url']
いると仮定していることに注意してください(主に、redditにメディアを埋め込むためのURLが必要です)。oembed
url
**更新:つまり、このようなもので問題が解決するはずです:
for post in reddit_posts:
if isinstance(post['data']['media'], dict) \
and "oembed" in post['data']['media'] \
and isinstance(post['data']['media']['oembed'], dict) \
and 'url' in post['data']['media']['oembed']:
print post["data"]["media"]["oembed"]["url"]
reddit_feed.append(post["data"]["media"]["oembed"]["url"])
print reddit_feed
このエラーが発生する理由は、一部post
の場合post["data"]["media"]
はNone
、基本的にNone["oembed"]
ここで呼び出しているためです。したがって、エラー:'NoneType' object is not subscriptable
。また、それはdictではない可能性があることにも気づきました。post['data']['media']['oembed']
したがって、それがdictであるかどうか、およびその中にあるかどうかも確認する必要がありますurl
。
アップデート2:
data
時々存在しないように見えるので、修正:
import json
import urllib
try:
f = urllib.urlopen("http://www.reddit.com/r/videos/top/.json")
except Exception:
print("ERROR: malformed JSON response from reddit.com")
reddit_posts = json.loads(f.read().decode("utf-8"))
if isinstance(reddit_posts, dict) and "data" in reddit_posts \
and isinstance(reddit_posts['data'], dict) \
and 'children' in reddit_posts['data']:
reddit_posts = reddit_posts["data"]["children"]
reddit_feed = []
for post in reddit_posts:
if isinstance(post['data']['media'], dict) \
and "oembed" in post['data']['media'] \
and isinstance(post['data']['media']['oembed'], dict) \
and 'url' in post['data']['media']['oembed']:
print post["data"]["media"]["oembed"]["url"]
reddit_feed.append(post["data"]["media"]["oembed"]["url"])
print reddit_feed