2011-01-03 5 views
0

J'utilise feedparser dans une tâche différée dans Google App Engine comme ceci:feedparser google appengine reporté aucune entrée?

class RSSFetchHandler(webapp.RequestHandler): 
    def get(self): 
     deferred.defer(parse_dk_indeed_com, feed) 

puis dans parse_dk_indeed_com Je l'extrait de code de code suivant:

import feedparser 
    def parse_dk_indeed_com(feed): 
    d = feedparser.parse(feed.url) 

Je peux voir que lorsque je me connecte asset.url renvoie une URL valide et je sais que le flux contient des éléments. Mais quand je me connecte len(d['entries']) il renvoie 0? Lorsque j'exécute le même extrait en utilisant nosetest, le test suivant passe:

assert len(d['entries']) > 0 

Qu'est-ce qui me manque?

+0

Qu'est-ce que 'asset.url'? Ce n'est pas dans le code que vous collez. S'il vous plaît, lorsque vous posez ces questions, incluez le code _original_, et autant que possible. –

Répondre

2

il semble que j'ai trouvé l'erreur moi-même. Il semble que Google a désactivé certaines bibliothèques dans le moteur de l'application, ce qui explique pourquoi le feedparser ne fonctionnera pas en utilisant l'extrait ci-dessus. Au lieu de cela j'aurais dû utiliser urlfetch:

from google.appengine.api import urlfetch 
import feedparser 
feed = urlfetch.fetch(asset.url) 

if feed.status_code == 200: 
rss = feedparser.parse(feed.content) 

logging.info("%d", len(rss['entries'])) 

le journal contient maintenant une entrée indiquant 20 entrées sont disponibles.

+0

ça me semble bizarre, j'utilise feedparser.parse (uri) et ça marche bien pour moi. – systempuntoout

+0

Après avoir posté cette question, je l'ai googlé et trouvé un article de blog affirmant que Google avait désactivé certaines bibliothèques qui affectent Feedparser. J'ai testé le téléchargement du contenu en utilisant urlfetch et cela fonctionne. –

+0

Qu'est-ce que 'certaines bibliothèques'? Il est vrai que certaines choses comme les sockets ne sont pas disponibles sur App Engine, mais rien de ce qui devrait affecter feedparser, beaucoup moins silencieusement. –

0

J'avais un problème très similaire qui était lié aux limites AppEngine. Alors que mon code d'origine était comme ça:

raw_feed = urlfetch.fetch(self.rss_feed_url).content 
    feed = feedparser.parse(raw_feed) 

Tous les tests unitaires sont passés par, mais quand les testicules lors des tests avec dev_appserver je recevais quelques exceptions vides de sens de feedparser qui (après le forage vers le bas) semblait être un dépassement de mémoire tampon (quand Feedparser essayait de lire de la chaîne). Le flux que j'essayais d'analyser était assez massif et j'ai rencontré quelques restrictions d'appengine Le remède consistait à remplacer string par StringIO (et/ou des fichiers temporaires). Maintenant mon code ressemble à ceci

tf = tempfile.TemporaryFile() 
    tf.write(urlfetch.fetch(self.rss_feed_url).content) 
    tf.seek(0) 
    feed = feedparser.parse(tf)