0

我在谷歌应用引擎的延迟任务中使用 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

我错过了什么?

4

2 回答 2

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 个条目可用。

于 2011-01-03T21:07:52.000 回答
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)
于 2012-01-03T22:17:34.273 回答