CSSセレクタでSITEINFO実践編 IT-PLUS
コメントでIT-PLUS(text()を使用しているので移植は無理ですよね…)の話が出ましたので、軽く説明を書きます。
移植という考え方では無理なのですが、要は何も無い状態からSITEINFOを書いている人と同じことをすればいいわけです。
XPathで考えるか、CSSセレクタで考えるか。Firebugで解析するかIE8開発者ツールで解析するか。という程度の違いで、やることは同じです。
たまにどうしようもないサイトがあるのは確かなんですが、それは別途書きます。
1. nextLink を選択するセレクタを検討する
肝心なのは pageElement よりも確実に nextLinkです。pageElement なんて最悪 body の中丸ごとでも次へをクリックしたと思えば我慢できる。
IE8で exampleUrl を開く
exampleUrl が書かれてないこともありますが、まあ url というとこに書いてある正規表現を見て適当に開けばいいです。
次のページへのリンクを探す
IT-PLUSの場合XPathでは以下のように定義されてました。
nextLink : id("kiji")/a[contains(text(), "次のページ")]
id="kiji" の直下の "次のページ" という文字列を含む a タグですね。
text()がある時点でもうこれは参考情報と割り切り、このリンクが他の方法で指定できないか、という考え方をします。
右上の枠で囲まれてるのがターゲットの nextLink です。
左下の枠で囲まれているツールバーのカーソルのボタンを押して要素選択モードにします。
要素選択モード中にマウスカーソルをブラウザ部分に持っていくと、カーソル位置の要素に枠が表示されます。
「次のページ」の上に持っていき、クリックすることで左下のHTMLツリー上のそのリンクがアクティブになります。
セレクタを検討する
さてここからがパズルだと思ってください。
反転しているのが「次のページ」です。親は確かに id="kiji" ですね。
肝心の a タグには href 以外の属性が無く、XPathで文字列指定しているのはまあ妥当かと思います。
- 順番の使用は避ける
最初に思いつくのは、「id="kiji" の下の最後の a」>「#kiji>a:last-of-type」です。
で、書いてみるとイケる!勝った!とか最初の内は考えがちなのですが…
最終ページを見てみると、同じ条件で「1」という前のページへのリンクがヒットしてしまいます。
1ページ目 > 2ページ目 > 1ページ目 > 2ページ目 > 1ページ目 …
このままではネロみたいに「パトラッシュ、ぼくはもうつかれたよ…」とか言いながら死んでしまう!!!
お前の安易なセレクタで人がどんどん死ぬことになるぞ!!
- 発想を変えて目印を探す
1ページ目のツリーを再度眺めます。
「次のページ」とその上の「2」のリンクって実はリンク先同じですよね。その上に class="select" の span があるにゃー。
select!?select!!!!!!!!!!!!!
選択中のページ番号は普通リンクになっておらず、CSS を使ってるサイトなら class が指定されていたり、そうでもないサイトでも strong とか b とかで太字になってたりします。
選択中のページの次のリンクを開けばいいじゃないですか。最後のページを確認しても、class="select" の後にリンクは無いし、死人も出ない。
nextLink : #kiji>.select+a
id="kiji" の子供の class="select" の 次の a という感じです。やりましたね!
.select は span.select でもいいです。今の所優劣があるのか分からんので好みで。
2. pageElement を選択するセレクタを検討する
とりあえず安易に決める
pageElement : id("headline")/p[contains(concat(" ", @class, " "), " article ")] | id("headline")/*[not(@id="kiji") and preceding::*[@class="headline" or @class="headline2"][last()] and following::*[@class="hit_navi"][last()]]
XPath 見てもなんだか分かりません。なげーよ。呪文みたいの多いし。
ちなみにこれ色々な邪魔な部分を捨てたいだけで、細かいこと気にしない漢だったら
pageElement : #headline
これで充分。しかし実際にやってみると下に関連記事とかがズラーッと並んでいます。
邪魔だわー。呪文みたいの書く気持ち分かる。
とは言え、初心者には難しいので pageElement は適当に開発者ツールで記事全体が含まれる枠を選んで、それを書けばいいです。
IT-PLUSなら上の通り。後で気になる人が現れて書き換えてくれるとか、自分のスキルアップを待ちましょう。
上を目指す
XPathを解析しながら移植したいところなんですが、パッと見で not() とかあります。
not() はCSSセレクタにもあるんですが、IE8はまだ対応していないし、fubでも拡張してませんからもちろん使えません。
欲しいものだけ全て選択する必要があります。限度がありますけど。
開発者ツールを使って、どこらへんが記事なのか調べます。
id="headline" の子階層を開き、順に洗い出していきます。
上は最初の h2 を選択したところ、ヘンなヘッダみたいのに枠が付きました。こいつ要らない。
次の a name="topnews" こいつ見えないし要らない。
次の p class="hit_navi" これページ選択部分ですね。こいつも要らん。
次の p class="article" XPathにも出てきましたね。なんかただの隙間が選択されました。なんなの。
こっから先ずっと p class="article" が続きます。
2個目の p class="article" を選択。ここらへんから欲しいわ。これ記事ですね。
その後も p class="article" は隙間代わりみたいのもありますが、これが僕の欲しい継ぎ足し部、って感じでしたので採用します。
pageElement : #headline>.article
なんか下に筆者紹介があります。ID付いた div ですね。筆者見たければこんな感じ。まああってもいいか。
pageElement : #headline>.article, #author
ハイできた。技術系とかビジネス系は大体似たような感じです。以上。