Feedparser 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?我用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条可用的条目。