Mon Aug 21 02:03:19 2006 GMT
HowToEntryFullText
EntryFullText について解説します。
概要
Plaggerのプラグインである Filter::EntryFullText は、HTMLページから文章を切り出して、いわゆる「全文入りRSS/Atomフィード」を作る事が出来るプラグインです。(extract)
もう一つの機能として、新聞社のニュースサイトのように多数のリンクがあるインデックスページから、リンクを抽出してフィードにエントリーを追加することが出来ます。(custom_feed)
主に、概要やタイトルだけしか入っていないRSS/Atomフィードを、全文入りフィードに変換するために使われています。 また、そもそも RSS/Atom フィード自体を提供していない旧来の形式のWebページでも、このプラグインを使って切り抜きすることで、RSS/Atomフィードを生成したりメールで送信したりする事が出来るようになります。
Webサイトごとの専用の設定ファイルを使う事で、さまざまな書き方のWebサイトに対応することができます。 切り出し設定(extract)は、XPath や非常に強力なPerlのregex(正規表現)を使用して書けるので、カスタマイズ性が高いのが特徴です。
Filter::EntryFullText プラグインのことをPlagger関係者は「EFT」と省略して表記することがあります。
機能説明
EFTには大きくわけて二つの機能があります。
- インデックスページからリンクされているurlを抽出して、複数のエントリーを生成する(custom_feed)
- Webページからテキストを切り出して、タイトルや日時や本文のデータを生成する(extract)
EFTの設定ファイルは assets/plugins/Filter-EntryFullText/ 以下に置かれています。一般的にhandleとextractとextract_captureを書くことで、ページからテキストを切り出す設定を指定します。
また、EFT設定ファイルはYAMLだけではなく、Perlスクリプトでも書く事が出来ます。 handleをurl以外の条件で適用したりする場合や、複雑な条件でextractの切り出しをしたい場合に.plでPerlスクリプトを書きます。
パラメータの解説(custom_feed編)
custom_feed_handle
custom_feedを適用するurlを正規表現で記述します。
例
custom_feed_handle: http://(?:www¥.)?youtube¥.com/(?:browse|results|my_favorites)
http://youtube.com/ のbrowseかresultsかmy_favoritesページであれば、この設定を適用してエントリーを抽出します。
custom_feed_follow_link
handleで適用されたWebページから、エントリーとして抽出するリンクurlを正規表現で記述します。
例
custom_feed_follow_link: /watch¥?v=¥w+
ページの中に/watch?v=hogehogeというリンクがあれば、それをエントリーとして追加します。
パラメータの解説(extract編)
handle
extractを適用するurlを正規表現で記述します。
例
handle: http://(?:www¥.)?youtube¥.com/(?:watch)¥?v=
youtube.com/watch?v=と文字がurlの一部とマッチすれば、この設定を適用して切り出しを実行します。
handle_force
extractを適用するurlを正規表現で記述します。通常のhandleと違い、bodyに文が含まれていても切り抜きを実行します。またconfigのforce_upgradeが0であっても実行されます。 RSS/Atom フィードが存在しなかったり、フィードが有ったとしてもタイトルだけで本文が含まれていない場合など、必ず本文を切り出すべきサイトの場合に、このhandle_forceを指定します。
例
handle_force: http://rssfeeds¥.usatoday¥.com/
rssfeeds.usatoday.com のurlであれば、この設定を適用して切り出しを実行します。
extract
regex(正規表現)で本文からtitle, body, dateなどを切り出す設定を書きます。
よく使われる書き方
- 該当するコメントタグに囲まれた文字をカッコで囲んで取り込む(capture)
<!-- START -->(.*?)<!-- END -->
- 連続した数字の並び
¥d+
- 連続した文字の並び
¥w+
- 取り込まないようにした「fooかbarかbaz」
(?:foo|bar|baz)
- 2006/08/20 22:17のような時刻表記を取り込む
(¥d{4}/¥d{2}/¥d{2} ¥d{2}:¥d{2})
例
extract: <title>(.*?)¥[クックパッド¥].*?<div id="recipe_detail">(.*?)<div style="float:right; margin-top:10px;">
タイトルタグのなかから [クックパッド] までの文字列を¥1に取り込み、<div id="recipe_detail">と<div style="float:right; margin-top:10px;">に囲まれた文字を¥2に取り込みます。(この例の場合だと、extract_capture: title body と指定して¥1をtitleに、¥2をbodyに入れています)
extract_capture
extractの正規表現で取り込んだ文字列を、エントリーのどの項目に対応させるのか列記して指定します。
またエントリーの項目に無い任意の文字列を指定することで、extract_after_hookで再利用するための一時的な変数を使う事ができます。(「もっと読む」をmoreに入れて、extract_after_hookでbodyと結合するなどの使われ方があります)
よく使われる項目
- title タイトル
- body 本文
- date 日付と時間
例
extract_capture: date body icon
bodyだけを切り出す最も簡単なEFT設定ファイルの例
handle: http://www¥.example¥.com/.*¥.html extract: <!-- start 本文 -->(.*?)<!-- end 本文 -->
extract_xpath
正規表現のかわりに XPath を使って切り出す対象を指定します。
例
extract_xpath: body: //div[@class="blog-entry"]
extract_date_format
Webページから日付や時刻を示す文字列を切り出して、そのエントリーの時刻情報を取得します。 (取得先のWebサーバーから Last-Modified ヘッダーで最終更新時刻が取得出来る場合は、その時刻情報をエントリーの日時として使用するので、EFT でdateを切り出す必要はないでしょう)
よく使われる項目
- %Y 年
- %m 月
- %d 日
- %H 時
- %M 分
- %S 秒
DateTime::Format::Strptimeのトークンを利用できます。
例
extract_date_format: %Y年%m月%d日%H時%M分
extract_date_timezone
Webページに書かれている時刻が、どの地域の時刻なのかを指定します。
よく使われる項目
- Asia/Tokyo
例
extract_date_timezone: America/Los_Angeles
extract_after_hook
データ取得後に、さらに何かの処理をしたい場合に使用します。任意のPerlスクリプトを実行できます。
よく使われる項目
- $data->{title} (エントリーのタイトル)
- $data->{body} (エントリーの本文)
- $data->{link} (エントリーのurl)
広告を消す例
extract_after_hook: |
$data->{body} =~ s!<div align="right">.*?ad_flash.*?</div>!!;
divタグと任意の文字列とad_flashと任意の文字列とdiv閉じタグにマッチした部分を消去しています。
config項目の解説
store_html_on_failure
1を指定すると、ページにregexがマッチしなかった場合でもWebページ全体を強引にbodyに入れます。デフォルトは0です。
例
- module: Filter::EntryFullText
config:
store_html_on_failure: 1
force_upgrade
1を指定すると、RSS/Atom フィードにbodyが含まれている場合でも、extractによる切り出しを実行します。デフォルトは0で、extractをスキップします。
例
- module: Filter::EntryFullText
config:
force_upgrade: 1