tagiter.rbの説明
概要
美しい物を愛する方は御使用をお控え下さい。
テキスト中のタグに囲まれた範囲をyieldするためのクラスです。
Stringではなく、自分自身のクラスのインスタンスをyieldします。テキストは
属性textを使って取り出します。
全部イテレータにするってのが本来の姿なのでしょうが、めんどくさいことも多いので値で返すメソッドも作りました。ガシガシとメソッドをカスケードさせて使うのが本来の使い方かもしれませんが、作者にもよくわかってません。
なんだか訳の分からない構造のhtmlファイルなどでも数回試行錯誤すれば必要な情報にアクセスできます。(ほんとか?)
漢字コードは各自でうまいことやって下さい。
TextTagIterator
属性
- text
- 保持しているテキストです
- option
- タグ識別用正規表現のオプションです。デフォルトは"pi"
- tag
- 保持しているテキストをくくっていたタグ(開始タグ)
- attributes
- tagにくっついていた属性をハッシュにしたもの。属性名はすべて小文字に変換されています。(→case ignoredになりました)
特異メソッド
- new(text,tag=nil,attributes={})
- 普通はファイルの内容を読み込み、それをtextとして渡します。第2引数以降は内部的に利用されるものです。気にしないで下さい。
メソッド
- nth(opentag,n,closetag=nil) |tagiter|
- opentagからclosetagまでくくられたテキストのn番目のものをyieldします。つまり1度だけyieldされます。
- opentagは"BODY"や"DL"などのように<や>は省略して指定します。closetagを省略すると、"/"+opentag(実際はちょっと違いますが)が設定されます。普通はclosetagは省略することでしょう。
- タグ走査の正規表現は'<(\s|\n)*'+element+'(\s|\n|>)'です。無駄な改行やスペースが入っても大丈夫なはず。
- 指定したタグの入れ子はちゃんと認識します。ですので、<t> <t>test</t></t> <t>OK</t>に対してnth("t",2)とすると、"OK"をTextTagIteratorにしたものを返します。
- 返り値として、閉じタグの後ろ側のテキスト全体をTextTagIterator(またはそのサブクラス)にした物を返します。
- first(opentag,closetag=nil) |tagiter|
- nth(opentag,1,closetag)そのまんまです。
- 実はnextといういろいろ紛らわしい別名を持っています。カスケードする時用。
- each_block(opentag,closetag=nil) |tagiter|
- nth()やfirst()は指定したn番目のテキストを一度だけしかyieldしませんが、これは開始タグと終了タグで見つかったテキストはすべてyieldします。
- これもタグのネストは認識しますので注意。
- 返り値は最後にyieldしたテキストより後ろ側のテキストをTextTagIterator(またはそのサブクラス)にしたもの
- enumtag(tag) |tagiter|
- DTやLIなどのタグは終了タグがありません。そこでtagを境目としてテキストを分割し、それぞれをyieldします。
- ただし、最初にyieldされるのは、最初のtagの後ろ側からです。それ以前の部分は無視されます。
- 返り値は特にありません。
- for_this() |tagiter|
- 自分自身をyieldします。
- get_nth(*arg)
- *argはnthと同じです。nthでyieldされるものを返り値として返します。
- get_first(*arg)
- *argはfirstと同じです。firstでyieldされるものを返り値として返します。
- collect(*arg)
- *argはeach_blockと同じです。each_blockでyieldされるものを配列に入れて返します。
- enumcollect(*arg)
- *argはenumtagと同じです。enumtagでyieldされるものを配列に入れて返します。
- tagexist?(tag,st=0)
- 保持しているテキストにtagで示されるタグが存在しているかどうかのチェック。
stは検索開始文字位置。
- tagnext
- 保持しているテキスト中で一番最初にあるタグを返す
- nth_trailer(tag,n)
- n番目のtagのブロックの後ろ側のテキストを返します。
- 中身は
nth(tag,n) do end
(定義)
例など
イテレータとして使ってカスケードしている例がtagiter.rbの最後に書いてあります。
毎度毎度イテレートさせてその中身を拾うのもめんどくさいので、適宜get_nth()やget_first()もお使い下さい。
closetagを自分で指定すると、いろいろ小細工が出来ます。
たとえばinfoseek.co.jpなどの検索結果はそれぞれ、
<!-- START ResURL_Search_JW>と
<!-- END ResURL_Search_JW> でくくられていますが、これらは、
each_block("!-- START ResURL_Search_JW","!-- END ResURL_Search_JW") do |ser|
とすることでそれぞれをyield出来ます。
同様に、</TITLE>から</HEAD>までのテキストを取得するなんて変なこともできます。
gooとinfoseek.co.jpとquote.yahoo.co.jp(d=v1)の検索結果をyieldするものが
sengine.rbです。
中にそれぞれのサイト用のクラスが定義してありますが、各々、eachメソッドが定義されています。yieldする内容は、|url,title,desc|。返り値は次の結果ページへのURLです。
これもファイルの最後に簡単な使用例があるので見て下さい。
tcup掲示板でsengine.rbと同じ事をする物がtcup.rbです。
titleに題名その他の情報が入り、urlには発言者が入ります。descは書き込み内容。
単純に横線が入るたびに千切っているので、発言中に<HR>が入るとおかしくなります。返り値は次のページへのURL。
注意など
閉じ忘れのあるタグに対してeach_blockをかけると結果が変になることがあります
(閉じ忘れたタグから先がまるごと一つの扱いになることがある)。
そういう場合は適宜、上位のタグでテキストを小さく分割してからお使い下さい。
更新履歴
- 00/09/18に更新されました。TextTagIterator#attributes[]の引数がcase-ignoredに。
- 00/06/06に更新されました。nth_trailer(tag,n)追加。tagnext変更。
- 00/06/05に更新されました。tagnextとtagexist?(tag)メソッド追加と、気の付いたバグ修正。
- 00/06/01に更新されました。最後に空行が無いなどのテキストに対して最外郭のタグをyieldさせようとするとエラーで止まってました。String#index()がnilを返す場合の処理忘れ。松井様、ご報告ありがとうございます。
- 00/05/08に更新されました。
<TAG attr=1><TAG attr=2>...
のように改行もなく連続したtagを対象にenumtagを走らせた場合、一つおきにyieldしてしまう(半分の個数しかyieldされない)のを修正。
- 00/04/26に更新されました。tagiter.rbのタグ属性解釈のバグ修正と仕様修正および、sengine.rbが一部動かなくなってたのでバージョンアップ。tcup掲示板のスクリプト追加
- 最初は何時だったか忘れました。
ということで
戻る
Email: nyasu@osk.3web.ne.jp