Shibuya.Plaggers::Publish::Kwiki
Logo
 welcome to Guest   Login

HowToEntryFullText RSS

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