2011-08-02 2 views
0

Je souhaite afficher un lien aléatoire + son nom à partir d'un flux RSS. Le code que j'utilise est:utilisation simplejson.loads

def updateFeed(url): 
    query_args = { 'q': 'http://news.google.com/?output=rss', 'v':'1.0', 'num': '15', 'output': 'json' } 
    qs = urllib.urlencode(query_args) 
    loader = 'http://ajax.googleapis.com/ajax/services/feed/load' 
    loadurl = '%s?%s' % (loader, qs) 
    logging.info(loadurl) 
    result = urlfetch.fetch(url=loadurl, 
          headers={'Referer': '...'}) 
    if result.status_code == 200: 
       news = simplejson.loads(result.content) 

Je reçois des données de réponse en JSON, mais je ne sais pas comment choisir au hasard un élément. Pouvez-vous s'il vous plaît des conseils?

{u'responseData': {u'feed': {u'feedUrl': u'http://news.google.com/?output=rss', u'description': u'Google News', u'author': u'', u'title': u'Top Stories - Google News', u'link': u'http://news.google.com/news?pz=1&amp;jfkl=true&amp;ned=us&amp;hl=en', u'entries': [{u'publishedDate': u'Tue, 02 Aug 2011 08:51:09 -0700', u'title': u'House Approved Debt Bill Faces Final Hurdle - NY1', u'author': u'', u'content': u'<table border="0" cellpadding="2" cellspacing="7" style="vertical-align:top"><tr><td width="80" align="center" valign="top"><font style="font-size:85%;font-family:arial,sans-serif"><a href="http://news.google.com/news/url?sa=t&amp;fd=R&amp;usg=AFQjCNEyXr4E-W9lA8bsV4_Zslubxd-6_g&amp;url=http://www.theglobeandmail.com/news/world/americas/little-sign-of-compromise-ahead-of-us-default-deadline/article2114420/"><img src="http://nt3.ggpht.com/news/tbn/dyFy2sz6rKRlJM/6.jpg" alt="" border="1" width="80" height="80"><br><font size="-2">Globe and Mail</font></a></font></td><td valign="top"><font style="font-size:85%;font-family:arial,sans-serif"><br><div style="padding-top:0.8em"><img alt="" height="1" width="1"></div><div><a 

Edit: Il fonctionne presque parfait et je en apprendre davantage sur JSON faire:

def updateFeed(url): 
    query_args = { 'q': 'http://news.google.com/?output=rss', 'v':'1.0', 'num': '15', 'output': 'json' } 
    qs = urllib.urlencode(query_args) 
    loader = 'http://ajax.googleapis.com/ajax/services/feed/load' 
    loadurl = '%s?%s' % (loader, qs) 
    logging.info(loadurl) 
    result = urlfetch.fetch(url=loadurl,headers={'Referer': '...'}) 
    if result.status_code == 200: 
     news = simplejson.loads(result.content) 

     """ not working, using random.randrange instead 
     some_key = random.choice(news.keys()) 
     something = news[some_key] 
     """ 
     i = random.randrange(0,10)#to do: instead of 10, it should be number of entries 
     title = news[u'responseData'][u'feed'][u'entries'][i][u'title'] 
     link = news[u'responseData'][u'feed'][u'entries'][i][u'link'] 
    return mark_safe('<a href="%s">%s</a>' % (link, title)) 

Répondre

3

Lorsque vous chargez JSON en Python, il est converti en (imbriqués) dicts et listes. { ... } les objets deviennent des dictionnaires et [ ... ] les éléments séparés par des virgules deviennent des listes.

Par exemple, pour obtenir l'URL de flux, vous pouvez faire:

feedUrl = news[u'responseData'][u'feed'][u'feedUrl'] 

Pour sélectionner un élément aléatoire dans un dictionnaire, vous pouvez faire:

import random 
some_key = random.choice(news.keys()) 
something = news[some_key] 
+0

Excellent! Enfin, je pourrais comprendre comment traverser la structure JSDON. J'ai mis à jour la question avec le code qui fonctionne presque parfait. C'est juste cet élément aléatoire que je n'ai pas pu obtenir le bon nombre d'entrées, mais cela ne devrait pas être trop difficile. –

+0

@Niklas: Vous semblez avoir besoin d'un élément aléatoire dans un tableau (mon exemple était pour les dicts). Vous pouvez obtenir la longueur d'une liste en utilisant la fonction intégrée 'len', par exemple:' i = random.randrange (len (nouvelles [u'responseData '] [u'feed'] [u'entries '])) ' – Cameron