1

以下のコードを実行すると、ブラウザにTypeErrorが表示されます。エラーは最後の行にあり、「NoneType」オブジェクトはサブスクリプト可能ではありません(すべてのアイテムのすべてのURLを取得しようとしています)。ただし、コマンドラインでフィード内のすべてのURLが印刷されるため、奇妙です。アイテムがコマンドラインに印刷されているのにブラウザにエラーが表示されている理由について何か考えはありますか?これを修正するにはどうすればよいですか?

#reddit parse
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"))["data"]["children"]
reddit_feed=[]
for post in reddit_posts:
    if "oembed" in post['data']['media']:
        print post["data"]["media"]["oembed"]["url"]
        reddit_feed.append(post["data"]["media"]["oembed"]["url"])  
print reddit_feed

編集

if post["data"]["media"]["oembed"]["url"]:
    print post["data"]["media"]["oembed"]["url"]
4

1 に答える 1

2

返されたjsonには投稿があり、フィールド(したがってmedia=nullフィールド)はありpost['data']['media']ません:oembedurl

     {
        "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が必要です)。oembedurl

**更新:つまり、このようなもので問題が解決するはずです:

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
于 2012-10-15T00:29:02.757 に答える