今さらながらpipesがマイブームなのでメモしておく。
そもそも何で今さら?という話ですが、"乃木坂 RSS"で検索すると出てくる胡散臭いサイトがあって、一体どういうものが出てくるのだ?と興味本位で登録してみたらpipesかよ!ということがありまして。
で、改めて調べてみると、XPathが使えてscraperチックなことができそう、ということが分かって、ちょっといじってみるかーとなったわけです。
1. Xpathでタイトルとリンクを取得
Extract using XPath: に "//div[@id='contents']/table/tr" を指定。"id('contents')" という形式は使えないっぽい。
この時点でデバッガウインドウを見てみると、こんな感じに。
"Emit items as string" をチェックしないとDOMツリーが出てくる。チェックするとHTMLテキストが出てくる。
ここではDOMを使いたいのでチェックしない。
3. 各記事の本文を取得
まあ無くてもいいんだけど、ニュースの本文がdescriptionに出てきたほうが見やすいので。さきほどマッピングしたitem.linkの各URLから本文のテキストをXPath "//div[@id='contents']" で取ってくる。
Loopモジュールと組み合わせるのがコツといえばコツかな?たいしたコツではない。
あとでいじるのでDOMではなくHTMLテキストとして出力させる。
4. 微調整
ニュース本文から余分なヘッダーやらフッターやらを除く。この辺泥臭いので、もう少しDOMを柔軟にいじるモジュールがあってもいいかなあ。あるのかも知れんが。
デバッガーでソースが見られるので、適宜整形。
<div id="contents"> <h2>2/27(木)bayfm78:K・WEST ENTAME GENERATION、出演決定!</h2> <div> <p>2014/02/24</p> </div> <br/> <div> <strong>bayfm78:K・WEST ENTAME GENERATIONへのゲスト出演が決定!</strong> </div> <div> <p> </p> </div> <div> <p>【日時】2月27日(木)19時〜</p> </div> <div> <p>【番組名】 <strong> <a rel="nofollow" target="_blank" href="http://homepage2.nifty.com/marua-S/kashifm.htm">bayfm78:K・WEST ENTAME GENERATION</a> </strong></p> </div> <div> <p>【出演者】田中美海、高木美佑 <br/> <br/> お楽しみに!</p> </div> <br/> <br/> <div class="back"> <a rel="nofollow" target="_blank" href="http://wakeupgirls.jp/news.php">< 戻る</a> </div></div>
これが
<div id="contents"><br/> <div> <strong>bayfm78:K・WEST ENTAME GENERATIONへのゲスト出演が決定!</strong> </div> <div> <p> </p> </div> <div> <p>【日時】2月27日(木)19時〜</p> </div> <div> <p>【番組名】 <strong> <a rel="nofollow" target="_blank" href="http://homepage2.nifty.com/marua-S/kashifm.htm">bayfm78:K・WEST ENTAME GENERATION</a> </strong></p> </div> <div> <p>【出演者】田中美海、高木美佑 <br/> <br/> お楽しみに!</p> </div> <br/> <br/> </div>
こんな感じ。Regexのオプションは説明が無いのでよく分からんけど、多分sがsingle line(<div>.+</div>とかで改行を含む文字列にマッチする)で、mがmultiple lines(^とか$が各行にマッチするようになる)という感じなのかな。mはPerlと同じ感覚でよいが、sはこういう解釈でいいいのだろうか。sとmを同時に指定したらどうなるんだろう・・・?
あと、内部のXML Parserを通しているせいか、"emit items as string"をチェックしても元データのHTMLとは違うものが出てくるので注意が必要。
まあ、とりあえず動けばよいか。