0

次のように、Google App Engine の遅延タスクで feedparser を使用しています。

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

私は何が欠けていますか?

4

2 に答える 2

2

自分でエラーを見つけたようです。Google が App Engine の特定のライブラリを無効にしているようです。これが、上記のスニペットを使用してフィードパーサーが機能しない理由です。代わりに、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 個のエントリが利用可能であることを示すエントリが含まれています。

于 2011-01-03T21:07:52.000 に答える
0

AppEngine の制限に関連する非常によく似た問題がありました。私の元のコードは次のようなものでしたが:

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

すべての単体テストは完了しましたが、testes を dev_appserver でテストすると、フィードパーサーから無意味な例外が発生し、(ドリルダウン後に) バッファ オーバーフローのように見えました (フィードパーサーが文字列から読み取ろうとしたとき)。解析しようとしていたフィードは非常に大規模で、appengine の制限に遭遇しました。解決策は、文字列を StringIO (および/または一時ファイル) に置き換えることでした。今私のコードは次のようになります

    tf = tempfile.TemporaryFile()
    tf.write(urlfetch.fetch(self.rss_feed_url).content)
    tf.seek(0)
    feed = feedparser.parse(tf)
于 2012-01-03T22:17:34.273 に答える