2011-01-03 1 views
0

이 같은 구글 애플리케이션 엔진에서 지연된 작업에 feedparser 사용하고 있습니다 : 다음피드 파서 google appengine 지연된 항목이 없습니까?

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 

무엇이 누락 되었습니까?

+0

'asset.url'은 무엇입니까? 붙여 넣을 코드에는 아무 것도 없습니다. 이 질문을 할 때 _original_ 코드와 관련 정보를 포함하십시오. –

답변

2

내가 직접 오류를 발견 한 것으로 보입니다. Google은 위의 스 니펫을 사용하여 피드 파서가 작동하지 않는 이유는 앱 엔진에서 특정 라이브러리를 사용 중지 한 것으로 보입니다. 대신 나는 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

은 나에게 이상한 소리이며, 나는 feedparser.parse (uri)를 사용하고 있으며 나에게 잘 작동하고있다. – systempuntoout

+0

이 질문을 게시 한 후 나는 그것을 검색하여 Google이 피드 파서에 영향을주는 특정 도서관을 사용 중지했다고 주장하는 블로그 게시물을 발견했습니다. urlfetch를 사용하여 콘텐츠를 다운로드 한 결과 작동했습니다. –

+0

'특정 도서관'은 무엇입니까? 소켓과 같은 것들은 App Engine에서는 사용할 수 없지만 피드 파서에 영향을주는 것은 아무것도 없으며 훨씬 덜 조용합니다. –

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)