[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.5.2 ウェブページのソース及びヘッダ情報を取得する

まず記事見出しを取得する対象となるウェブページを決めることから始めます。 フレーム表示されている場合は、フレームの中で必要なページだけを単独で指し 示す URL を特定するべきです。特定できたら、新たに作成す る `shimbun' モジュールの中で luna-define-method を使い、 shimbun-index-url の定義を作成しましょう。単純に URL を返すように すれば良いですよ。後で説明しますので、変 数 shimbun-foobar-groups も用意しておきましょ う(15)

 
(defvar shimbun-foobar-url "http://www.foobar.net")

(luna-define-method shimbun-index-url ((shimbun shimbun-foobar))
  shimbun-foobar-url)

(defvar shimbun-foobar-groups '("news"))

shimbun-headers メソッドは `shimbun.el' の中に既に定義されて いますから、`sb-foobar.el' で shimbun-index-url メソッドの定 義を作成すればウェブページのソースの取得ができるようになります。 shimbun-headers はウェブページのソースを取得した後、 shimbun-get-headers メソッドを呼び、ヘッダ情報の収集に入ります。 `shimbun.el' の中には shimbun-get-headers のメソッド宣言があ りせんから、`sb-foobar.el' の中で独自にメソッドを作成しなければなり ません。

`sb-foobar.el' に shimbun-get-headers のメソッドを作成するた めに、取得したページのソースを分析しましょう。どのような正規表現で記事の ヘッダ情報を収集するかを検討します。記事の見出しとして特に必要な情報は、 標題、日付、作成者、その記事の URL、そして message-id です。これ らの情報は、それぞれの MUA において、Subject, Date, From, Xref, Message-ID として表示されます。例えば、下記の

 
<a href="030530.html">5月30日の話題(投稿者-みきお &lt;foo@bar.net&gt;)</a>

のような行を集めて記事にしたいのでしたら、

 
"<a href=\"\\(\\([0-9][0-9][0-9][0-9]\\)[0-9][0-9]\\.html\\)\">\\([^<(]+\\)(投稿者-\\([^<]+\\))<\/a>"

のような正規表現になるでしょう。そして記事の Xref の値は (match-string 1) で取得できます、Date は (match-string 2) の値を加工すれば良いでしょう。Subject は (match-string 3) で取得できますね。From は (match-string 4) を加工すれば良いでしょう。これらの値 は MUA で見易いように更に加工しても構いません。`sb-muchy.el' では結 構凝った Subject を作っていますので一度見て下さい。

上記のように記事の URL が相対パス表示されている場合は、 shimbun-expand-url を使用し、絶対パス表示に変更してからヘッダに収 めましょう。記事の URL がヘッダの URL と同じ、つまり記事毎に 個別に URL を持たない構造のウェブページもあります。この場合は少しやっか いで、ヘッダ情報取得の段階で、記事の内容も取得しておき、Emacs のメモリに 収めておく必要があります。具体的には `sb-palmfan.el', `sb-dennou.el', `sb-tcup.el' の `shimbun-headers' メソッ ドの定義を参照して下さい。

ウェブページによっては Date が特定できないものがあります。そういう場合は 無理に特定せずとも "" を入れておけば OK です。記事の内容を見て初 めて Date が特定できるなら、shimbun-make-contents メソッドの中で 改めてヘッダに Date の情報を入れても OK です。それから、From を決め打ち しても良い場合もあります。

message-id の作成には注意を要します。一部の記事が読めなかったりし ますので(16)、必 ず単一性 (uniqueness) を保証しなければなりません。日付やドメイン、そのペー ジの URL の一部を使って文字列を生成することで単一性を確保しましょう。そ の他、message-id の一部に必ず `@' を含めるようにし、逆 に `:' は含まないようにしましょう。このルールを守らないとインライン 画像がきちんと出力されませんよ。詳しくは RFC2387, RFC822 を参照して下さ い。

苦労して取得したこれらの情報は shimbun-create-header という関数を 利用してヘッダに収めます。

結局 `sb-foobar.el' の中での shimbun-get-headers の定義の骨 組みはこんな風になりますね。

 
(luna-define-method shimbun-get-headers ((shimbun shimbun-foobar)
                                         &optional range)
  (let ((regexp "....")
        subject from date id url headers)
    ...
    (catch 'stop
      (while (re-search-forward regexp nil t nil)
        ...
        (when (shimbun-search-id shimbun id)
          (throw 'stop nil))
        (push (shimbun-create-header
               0 subject from date id "" 0 0 url)
              headers)))
    headers))

なお、このメソッドの中では shimbun という一時変数で、 `shimbun' モジュール `shimbun-foobar' のインスタンスにアクセス できます。

ところで、先程保留にした変数 shimbun-foobar-groups について説明し ましょう。

仮に http://www.foobar.net の中に読みたい記事グループが二つあっ て、それぞれの記事のヘッダ情報を得るウェブページが別々の場所にあったとし ましょう。http://www.foobar.net/whatsnew/index.hmtl にサイト の更新情報が、http://www.foobar.net/ml/index.html に ML の記 事アーカイブの一覧があるときなどです。こういう場合は、`shimbun' モ ジュール foobar のグループとして、foobar.whatsnew, `foobar.ml' としてアクセスできると便利ですよね。そういう場合は下記 のようにしてみましょう。

 
(defvar shimbun-foobar-url "http://www.foobar.net")

(defvar shimbun-foobar-group-path-alist
  '(("whatsnew" . "/whatsnew/index.html")
    ("ml" . "/ml/index.html")))

(defvar shimbun-foobar-groups
  (mapcar 'car shimbun-foobar-group-path-alist))

(luna-define-method shimbun-index-url ((shimbun shimbun-foobar))
  (concat shimbun-foobar-url
          (cdr (assoc (shimbun-current-group-internal shimbun)
                      shimbun-foobar-group-path-alist))))

現在ユーザがアクセスしているグループに は shimbun-current-group-internal を使えば分かります。 shimbun-get-headers などでもグループが違えば作業内容が違ってくる 可能性もありますね。

なお、`shimbun' モジュール一つにつき、最低でも一つのグループが必要 です。グループの名前の決め方に特に決まりはありませんが、グループ名に悩ん だら、`news' とか `main' などと付けておきましょう。



This document was generated by TSUCHIYA Masatoshi on November, 3 2005 using texi2html