2013-05-24 25 views
8

私はfeedparserとetagsを使用して修正されていないRSSフィードをスキップしようとしています。 ドキュメントのガイドラインに従って:http://pythonhosted.org/feedparser/http-etag.htmlPython:feedparserとetagsでRSS更新を確認する方法

import feedparser 

d = feedparser.parse('http://www.wired.com/wiredscience/feed/') 
d2 = feedparser.parse('http://www.wired.com/wiredscience/feed/', etag=d.etag) 

print d2.status 

この出力:

200 

は、このスクリプトは304を返すべきではないでしょうか。 私の理解は、RSSフィードが更新されるとエタグの変化が起こり、一致すれば304になるはずです。

どうして私の予期した結果が得られませんか?

+1

私のマシンでは再生できません。 Python 2.6でfeedparser-5.1.3を使用して '304'を取得しました – RedBaron

+0

私はDebian 6でpython 2.6とfeedparser-5.1.3も使用しています – Marc

+0

Ah!おそらく私の組織のプロキシはキャッシングをしているので、問題は見えません。 – RedBaron

答えて

16

明らかに、このサーバーは「If-Modified-Since」ヘッダーをチェックするように構成されています。最後に変更した時刻も渡す必要があります。

>>> d = feedparser.parse('http://www.wired.com/wiredscience/feed/') 
>>> feedparser.parse('http://www.wired.com/wiredscience/feed/', 
        etag=d.etag, modified=d.modified).status 
304 
>>> feedparser.parse('http://www.wired.com/wiredscience/feed/', 
        etag=d.etag).status 
200 
+0

それはModifiedヘッダーで動作すると言っても間違いありません。しかしこの場合、etagを完全に取り出すことができ、304を返します。 これには、かなりのビットのフィードがありますが、etagヘッダーがあり、変更されたヘッダーはありません。 Etagsが機能しない理由はありますか?要求を出しているサーバーに関連している可能性がありますか? – Marc

+2

Etagと最後に変更されたヘッダーは、2つの独立したキャッシング技術です。一部のサーバーではそのうちの1つを使用するものもあれば、両方を使用するものもありますすべてのサーバーのキャッシュをサポートする場合は、ブラウザの標準動作をエミュレートする必要があります。現代のブラウザは、etagとif-modified-sinceの両方のヘッダを送るので、同じことをする必要があります。 –

関連する問題