feedparser Google Appengine отложено нет записей? - PullRequest
0 голосов
/ 03 января 2011

Я использую feedparser в отложенной задаче в движке приложений Google, например:

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

, а затем в parse_dk_indeed_com У меня есть следующий фрагмент кода:

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

Я вижу, что когда я регистрирую asset.url, он возвращает действительный URL, и я знаю, что в ленте есть элементы. Но когда я регистрирую len(d['entries']), возвращается 0? Когда я запускаю один и тот же фрагмент, используя тест на нос, следующие тесты проходят:

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

что мне не хватает?

Ответы [ 2 ]

2 голосов
/ 04 января 2011

кажется, что я сам нашел ошибку. Похоже, что Google отключил некоторые библиотеки в движке приложения, поэтому feedparser не будет работать с использованием приведенного выше фрагмента. Вместо этого я должен был использовать 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']))

журнал теперь содержит запись о том, что доступно 20 записей.

0 голосов
/ 04 января 2012

У меня была очень похожая проблема, связанная с ограничениями AppEngine. Хотя мой оригинальный код был таким:

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

Все модульные тесты прошли, но когда тестировались при тестировании с dev_appserver, я получал некоторые бессмысленные исключения из feedparser, которые (после детализации) оказались переполнением буфера (когда feedparser пытался прочитать из строки). Канал, который я пытался проанализировать, был довольно массивным, и я столкнулся с некоторыми ограничениями на устройство Средством исправления было заменить строку на StringIO (и / или временные файлы). Теперь мой код выглядит так

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