Feedparser Google App Engine 延迟无条目?

0 投票
2 回答
512 浏览
提问于 2025-04-16 09:21

我在谷歌应用引擎中使用了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?我用nosetest运行同样的代码片段时,下面的测试是通过的:

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

我到底漏掉了什么呢?

2 个回答

0

我遇到了一个很相似的问题,这个问题和AppEngine的限制有关。我的原始代码是这样的:

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

所有的单元测试都通过了,但当我用dev_appserver测试时,收到了feedparser的一些无意义的异常。经过深入分析后发现,这似乎是一个缓冲区溢出的问题(当feedparser试图从字符串中读取数据时)。我尝试解析的那个数据源非常庞大,因此遇到了一些AppEngine的限制。

解决这个问题的方法是用StringIO(或者临时文件)替代字符串。现在我的代码看起来是这样的:

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

看起来我自己找到了错误。似乎谷歌在应用引擎中禁用了某些库,这就是为什么上面的代码片段中的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条可用的条目。

撰写回答