質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5085閲覧

Pythonでrssリーダーの作成

DaichiYasuda

総合スコア173

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2016/07/11 14:14

編集2016/07/12 00:53

feedparserモジュールを使ってrssリーダーを作成しています。
目的
朝一に特定のサイトの前日分の記事を取得したい

現在のスクリプト

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4import feedparser 5from datetime import datetime 6from time import mktime 7 8#RSSのURL 9RSS_URL = "http://jp.techcrunch.com/feed/" 10 11#RSSの取得 12feed = feedparser.parse(RSS_URL) 13 14#RSSのタイトル 15print feed.feed.title 16 17for entry in range(len(feed.entries)): 18 19 #RSSの内容を処理 20 title = feed.entries[entry].title 21 link = feed.entries[entry].link 22 time = feed.entries[entry].updated 23 24 25 #表示 26 print title 27 print time 28 print link

前日の日付の記事のみ取得するにはどうしたらよろしいでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

更新日時(updated)で前日の記事かどうか判断するならば、
entry.updated_parsedstruct_time型に変換された日時が格納されていますので、
それを使ってfilterをかけてみましょう。

昨日かどうかチェック、のところは私もすぐには分からなかったので調べてみて下さい。

lang

1def f(entry): 2 # TODO entry.updated_parsedが昨日かどうかチェック 3 return True 4 5for entry in filter(f, feed.entries): 6 print(entry.updated, entry.link, entry.title)

投稿2016/07/11 14:52

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DaichiYasuda

2016/07/12 01:16 編集

回答を参考にして下記のように変更しました。 yesterday = datetime.date.today() - datetime.timedelta(days=1) #RSSのタイトル print feed.feed.title def f(entry): time.mktime(entry.updated_parsed) = yesterday: return True for entry in filter(f, feed.entries): print(entry.updated, entry.link, entry.title) が、entry.updated_parsedが昨日かどうかのチェックがまだうまいことできてないです。
argius

2016/07/12 03:30

・datetimeは日時なので、同じ日をチェックするにはdateに変換する必要があります。 ・return Trueはダミーの戻り値なので消して、それの代わりに比較演算式をreturnする必要があります。 ・比較演算なので、=は1つでは無く2つの==にしないといけません。 ・time.mktimeよりもdatetimeコンストラクターの方が良い? 以上を踏まえると、こうなります。 from datetime import datetime, timedelta yesterday = (datetime.today() - timedelta(days=2)).date() def f(entry): return datetime(*entry.updated_parsed[:6]).date() == yesterday
DaichiYasuda

2016/07/12 04:16

回答ありがとうございます 参考にしてコードを書き直しましたが、、、 ============================== #!/usr/bin/env python # -*- coding: utf-8 -*- import feedparser from datetime import datetime, timedelta from time import mktime yesterday = (datetime.today() - timedelta(days=2)).date() #RSSのURL RSS_URL = "http://jp.techcrunch.com/feed/" #RSSの取得 feed = feedparser.parse(RSS_URL) #RSSのタイトル print feed.feed.title def f(entry): return datetime(*entry.updated_parsed[:6]).date() == yesterday return True for entry in range(len(feed.entries)): #RSSの内容を処理 title = feed.entries[entry].title link = feed.entries[entry].link time = feed.entries[entry].updated #表示 print title print link print time ============================== 月が地球に写り込むレアな瞬間を捉えたNASAの写真 http://jp.techcrunch.com/2016/07/12/20160711moon-photobombs-the-earth-in-rare-images-captured-by-nasa/ Tue, 12 Jul 2016 03:11:00 +0000 実行すると今日の記事も取れてしまいます。。。 日付の形式が違うからでしょうか? 何度も申し訳ないですが教えていただけないでしょうか?
argius

2016/07/12 04:23

実際に動作させてみているので上手く行くはずですが... おっと、for文のところがfilterになってないですね。 念のためf関数のreturn Trueも削除してくださいね。
DaichiYasuda

2016/07/12 04:37

コードを書き直しました。 が、、動きません。。。 エラーなどは出ないのですが TechCrunch Japan RSSのタイトルが出力されるだけになってしまいました。 ============================= #!/usr/bin/env python # -*- coding: utf-8 -*- import feedparser from datetime import datetime, timedelta yesterday = (datetime.today() - timedelta(days=2)).date() #RSSのURL RSS_URL = "http://jp.techcrunch.com/feed/" #RSSの取得 feed = feedparser.parse(RSS_URL) #RSSのタイトル print feed.feed.title def f(entry): return datetime(*entry.updated_parsed[:6]).date() == yesterday for entry in filter(f, feed.entries): #RSSの内容を処理 title = feed.entries[entry].title link = feed.entries[entry].link time = feed.entries[entry].updated #表示 print title print link print time ============================= 何度も申し訳ないです。 python勉強中なので教えていただけないでしょうか
argius

2016/07/12 04:44

timedelta(days=2)で2日前のデータは存在しないからでは? days=1にすれば表示されるはずです。 for文の中のentryは直接feed.entriesの1要素が取り出せています ので、feed.entries[entry].titleはentry.titleに直してください。 残りの2行も同様に直してください。
DaichiYasuda

2016/07/12 05:31

ありがとうございました! 下記のコードで動きました! ============================= #!/usr/bin/env python # -*- coding: utf-8 -*- import feedparser from datetime import datetime, timedelta yesterday = (datetime.today() - timedelta(days=1)).date() #RSSのURL RSS_URL = "http://jp.techcrunch.com/feed/" #RSSの取得 feed = feedparser.parse(RSS_URL) #RSSのタイトル print feed.feed.title def f(entry): return datetime(*entry.updated_parsed[:6]).date() == yesterday for entry in filter(f, feed.entries): #RSSの内容を処理 title = entry.title link = entry.link time = entry.updated #表示 print title print link print time ============================= あと取得する記事数を増やしたいので参考にされてるサイトを教えていただけないでしょうか?
argius

2016/07/12 05:51

おめでとうございます! 記事数を増やしたい、というのはどういうことでしょう? RSSフィードが返すエントリー件数はおそらくサイト側で決まっているものなので増やせないと思いますが、 もしかしたらサイト側で返す件数を指定するような機能を提供している可能性があるかも知れません。 (あくまで可能性であって、望み薄ですが...) サイトのRSSの説明があればそれを読んでみてはいかがでしょうか。 特に参考にしたサイトは無いです。 feedparserは詳しくないですが、自分でRSSリーダーを作ったことはありますので、 feed = feedparser.parse(RSS_URL) でオブジェクトを取得して、あとはそれをPythonの機能で絞り込めば良いと考えた結果、このような回答になりました。
DaichiYasuda

2016/07/12 06:18

RSSフィードが返すエントリー件数はおそらくサイト側で決まっているものなので増やせないと思いますが、 もしかしたらサイト側で返す件数を指定するような機能を提供している可能性があるかも知れません。 ↑そうなんですね。 ということは更新の早いサイトは一日に何度か取得してなければならないですね。 DBにデータを突っ込んでー とかですね、、、 先が長そうです。 ありがとうございました、助かりました!
argius

2016/07/12 06:31

ちょっとだけ補足。 RSSフィードというのは、単なるXMLファイルで、 そのサイトの記事が更新されるときに合わせて更新されています。 WebブラウザーでフィードのURLを開いてみると分かります。 (場合によっては開いてから「ソースの表示」をしないとXMLが見えないかも) そこに何件載せるか、または何日前までの記事を載せるかは サイト次第です。 なので、サイトによっては、おっしゃるとおり > 更新の早いサイトは一日に何度か取得してなければならないですね。 > DBにデータを突っ込んでー などの対応が必要ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問