【问题标题】:Decoding JSON from Reddit API in Python using PRAW使用 PRAW 从 Python 中的 Reddit API 解码 JSON
【发布时间】:2012-09-25 00:47:52
【问题描述】:

我在 Python/GTK 应用程序中使用 PRAW for Reddit API。我已经成功使用 API,但我似乎无法解码 JSON 以供使用。应该知道,我是 Python 和 GTK 应用程序的初学者。

# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
### BEGIN LICENSE
# This file is in the public domain
### END LICENSE

import gettext
from gettext import gettext as _
gettext.textdomain('redditreader')

from gi.repository import Gtk # pylint: disable=E0611
import logging
logger = logging.getLogger('redditreader')

from redditreader_lib import Window
from redditreader.AboutRedditreaderDialog import AboutRedditreaderDialog
from redditreader.PreferencesRedditreaderDialog import PreferencesRedditreaderDialog

import praw

import json
import simplejson
from pprint import pprint

# See redditreader_lib.Window.py for more details about how this class works
class RedditreaderWindow(Window):
    __gtype_name__ = "RedditreaderWindow"

    def finish_initializing(self, builder): # pylint: disable=E1002
        """Set up the main window"""
        super(RedditreaderWindow, self).finish_initializing(builder)

        self.AboutDialog = AboutRedditreaderDialog
        self.PreferencesDialog = PreferencesRedditreaderDialog

        # Code for other initialization actions should be added here.
r = praw.Reddit(user_agent='example')
try:
    submissions = r.get_front_page(limit=5)
    [str(x) for x in submissions]
    jsondatafirst = simplejson.loads(str(submissions))
    jsondata = unicode(jsondatafirst, 'utf-8')
    print(jsondata)
except (simplejson.decoder.JSONDecodeError, ValueError):
    print 'Decoding JSON has failed'

【问题讨论】:

    标签: python json api gtk reddit


    【解决方案1】:

    JSON 只是一个字典字典,如果需要,可以使用列表进行扩展。

    熟悉您目前正在处理的任何 JSON 的一个好方法是加载它,并通过以更直接的方式访问字典元素来玩弄它。

    >>> import urllib2
    >>> import json
    >>> response = urllib2.urlopen('http://reddit.com/user/droogans.json').read()
    >>> js = json.loads(response)
    >>> comment = js['data']['children'][0]['data']
    >>> #this is my most recent comment, along with a lot of other interesting stuff
    >>> print comment['ups']
    9001
    

    所以,探索数据,你会更好地理解它。

    【讨论】:

    • 我了解通过 urllib2 获取该数据的方式,但是有没有办法通过 PRAW 来获取?
    • 当我阅读 PRAW 教程时,据我了解,它的设计目的就像是开发人员和我在示例中对 Reddit API 进行的那种调用之间的抽象。至于您的具体问题,我认为您可以通过删除 try 块中的两行来缩小范围,并确保给您带来麻烦的是加载或编码。
    • 是解码给我带来了麻烦。从 PRAW 教程复制的代码运行良好。
    • 我不想等待五分钟来编辑我的最后一个。好的,所以我确实需要在使用 PRAW 之后解码 JSON,或者我可以仅使用 PRAW 示例代码使用 JSON 数据吗?
    • 您可能想尝试完全摆脱unicode(json, 'utf-8') 行,原因有两个:一,unicode 函数需要一个字符串或缓冲区,而不是字典。其次,从PRAW返回的数据不是以u''字符串格式返回的吗?我不能保证,但我当然希望它会。
    【解决方案2】:

    使用 PRAW,您无需进行任何 json 解码,因为 PRAW 会为您处理所有这些。

    例如,对于每个提交,您要打印出赞成票数、反对票数和提交标题。你可以这样做:

    for submission in r.get_front_page(limit=5):
        print submission.ups, submission.downs, submission.title
    

    如果您想查看可用于提交对象的所有属性,您可以运行:

    import pprint
    for submission in r.get_front_page(limit=5):
        pprint.pprint(vars(submission))
    

    此外,如果您想从提交中获取 cmets,则可以使用 submission.comments 属性。您还可以手动查看请求的 json 响应,以了解哪些属性应该可通过 PRAW (example) 获得。

    属性没有明确列出对象的任何地方,因为属性是直接从请求的关联 json 响应中的任何键名创建的。

    【讨论】:

    • 不客气。如果您还有任何 PRAW 问题,/r/redditdev 是提出此类问题的“官方”地方。虽然我刚刚为与 reddit 相关的问题设置了一个 SO 警报,所以我现在也应该在这里看到它们(我是 PRAW 包维护者)。
    猜你喜欢
    • 2017-07-20
    • 2019-02-18
    • 1970-01-01
    • 2020-10-17
    • 2020-08-16
    • 1970-01-01
    • 2018-09-19
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多