GreasemonkeyのスクリプトでAutoPagerizeというものがあります。これはgoogleの検索結果のように何ページにもページが別れているときに、次のページを表示するためのリンクを押さなくても自動的に次のページの中身がAjaxで継ぎ足されて表示されるというものです。
オモロ 検索エンジン SAGOOL サグール の検索結果のページがAutoPagerizeとおなじしくみになっていて、検索結果を一番下まで見ると自動でさらに10件が表示されるようになっているので試してみてください。
これが極めて快適で、慣れると次へのリンクを押す生活には戻れません。記事全体は長いのに1ページの文章量が少なくて、次のページへのリンクをやたら押さないといけないニュースサイトなどは当然のように対応されていて、クリックする必要がなくなって、ストレスなく文章に集中できるようになります。対応しているサイトも SWDYH - SITEINFOの数をグラフにしてみた によればうなぎのぼりという状況です。普段使うようなサイトはほとんど対応されているでしょう。
AutoPagerizeは、どの部分がページ固有の内容で、次のページへのリンクはどれか、ページを繋ぎ合わせるときにはどこに繋げればいいのか、という情報をニンゲンが各サイトごとにXPathで記述してあげる、という解決策をとっています。
autopagerize.user.js
のSITEINFO_IMPORT_URLS
に追加してそのURLに書くautopagerize.user.js
の中に(Windowsなら \Documents and Settings\USERNAME\Application Data\Mozilla\Firefox\Profiles\PROFILENAME\gm_scripts に、OSXなら ~/Library/Application Support/Firefox/Profiles/PROFILENAME/gm_scripts/ にあります)、SITEINFOを記述したURLが書かれた部分
var SITEINFO_IMPORT_URLS = [
'http://swdyh.infogami.com/autopagerize',
'http://userjs.oh.land.to/pagerization/convert.php?file=siteinfo.v5',
]
があるので、ここに自分のサーバのURLを書いて、そこのファイルを編集すると便利です。
SITEINFO
配列に直接書くこともできます。
var SITEINFO = [
/* sample
{
url: 'http://www.google.*?/search*',
nextLink: 'id("navbar")/table/tbody/tr/td[last()]/a',
insertBefore: 'id("navbar")',
pageElement: '//div[2]',
},
*/
]
とコメントアウトされている部分にSITEINFOを書いてもokです。
書いた後はGreasemonkeyのメニューから clear cache を行ってSITEINFOを再度読み込ませる必要があります。はじめこれがわからなくてはまりました....
あとはばりばりSITEINFOを書いていくだけです。が、ブラウザを開いていてAutoPagerizeされていないのに気づいて、ソースを見てエディタを開いてXPathを書いて cache clear して動かしてみる、というのは、簡単な作業のわりにめんどくさくてやりたくないです。
そんなわけでAutoPagerizeのSITEINFO記述を楽にするためのブックマークレットを作りました。まだ単体ではきれいなXPathを作れませんがfirebugと組み合わせると、ゼロから書くよりかなり楽ができます。
テストツール OpenQA: Selenium のためのテストケース記述を極めて簡単にしてくれたSelenium IDE :: Firefox Add-onsにあやかって AutoPagerize IDE という名前にしました。
pageElement
にクリックした部分を表すXPathが入ります。長いので全部表示されていませんが
//div[@id="frame"]/div[@id="wrapper"]/div[@id="contents"]/div[@id="index"]/div[@id="articles"]
というXPathが入っています。ここでいきなりfirebugの助けを借ります。slashdotのHTMLの構造と、現在のAutoPagerizeのinsertBefore
でページの内容を追加するという仕様上、pageElement
がこの記述だとページを繋げたときに表示が乱れてしまうので、手で最後に/div
を付け加えます。
//div[@id="frame"]/div[@id="wrapper"]/div[@id="contents"]/div[@id="index"]/div[@id="articles"]/div
XPathを変更すると、変更されたXPathにマッチする要素が囲まれます。テキストボックスからフォーカスが外れたときにXPathが評価されるので、変更したらどこかをクリックしてpageElement
のテキストボックスからフォーカスを外してください。
pageElement
のXPathにマッチするので色が変わっていますが、変わっていても問題ありません。
[last()]
を追加します。(あとで気づいて直したため、スクリーンショットを取り直す元気がなくてスクリーンショットでは全部最後が/a
になっていますが/a[last()]
のほうが正しい記述です。
pageElement: //div[@id="frame"]/div[@id="wrapper"]/div[@id="contents"]/div[@id="index"]/div[@id="articles"]/div
insertBefore: //div[@id="frame"]/div[@id="wrapper"]/div[@id="contents"]/div[@id="index"]/div[@id="articles"]/div
nextLink: //div[@id="frame"]/div[@id="wrapper"]/div[@id="contents"]/div[@id="index"]/div[@id="articles"]/a[last()]
[@id="google_adsense"]
url: http://slashdot.jp/
というXPathを得ることができました。
この記述でうまくAutoPagerizeできるかどうかはapply thisボタンで試すことができます。
<h3>スラッシュドット ジャパン : アレゲなニュースと雑談サイト</h3>
<p><textarea class="autopagerize_data" readonly="readonly">
url: http://slashdot.jp/
nextLink: //div[@id="frame"]/div[@id="wrapper"]/div[@id="contents"]/div[@id="index"]/div[@id="articles"]/a[last()]
insertBefore: //div[@id="frame"]/div[@id="wrapper"]/div[@id="contents"]/div[@id="index"]/div[@id="articles"]/div[@id="google_adsense"]
pageElement: //div[@id="frame"]/div[@id="wrapper"]/div[@id="contents"]/div[@id="index"]/div[@id="articles"]/div
</textarea></p>
書き込んで読み込ませました。
SITEINFOがうまく記述できていると、ページを表示したときにAutoPagerizeによって右上に緑色の四角が表示されます。
ページの下までスクロールさせると、AutoPagerize IDEで試したときとおなじようにページを繋ぐことができました。
なくてもいいけどあるとべんりな一品です。
そしてAutoPagerizeが手放せなくなってAutoPagerizeされていないページを見つけたときにはAutoPagerize IDEでSITEINFOを作ってみてください。=)
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/141
comments