まえに作ったWeb::Scraperのjavascriptバージョンwebscraper.jsとXPathをてきとうに作ってくれる機能を追加したwebscraperp.jsにHTMLのドキュメントから繰り返し部分をみつけてSITEINFOをつくるAutoPagerize Iteration Detectorみたいなみためをくっつけて、取り出したい部分をクリックしたらてきとうにXPathを生成してWeb::Scraperのコードにして出してくれるFirefoxのextensionを作りました。Firefox3専用です。ごめんなさい。


クリックされた要素から繰り返し部分を判別してそのXPathを生成と、繰り返し部分からクリックした要素の相対的なXPathの生成を自動的にやります。ちょっとだけ処理が重いのでクリックしたあと反応がなくなった感じになりますが、スペックにもよりますがたぶん2,3秒くらい待てば反応が返ってくるので、押したあとちょっとだけ待つかんじで使ってみてください。



$resultに取り出したいデータが入ります。
webscraperp.jsは、ページの中にとりだしたいデータが繰り返し入っていることをいまのところ前提にしています(入っていないときに対応させるのは簡単なのですがまだやってないです)。webscraperp.jsは、とりだす部分として明示的に指定された要素のXPathを作ることと、そこから繰り返し部分(以下paragraphと呼びます)のXPathを推定することをしています。
取り出す部分のXPathは、指定された要素からHTMLドキュメントのルートの要素に到達するまで親要素をたどっていけば簡単に作ることができます。ただそれだとHTMLの変化に対してとても弱いXPathになってしまうので、HTMLにつけられているクラス名やIDを使ってXPathを生成します。
paragraphのXPath推定は、明示的に指定された要素の共通の祖先を基準にして、親要素をたどっていき、兄弟要素に同じような子孫要素を持つところを見つけて、同じような子孫を持つ兄弟要素にマッチするXPathを生成しています。このとき似たような子孫をたまたま持っているけれど、paragraphのひとつとしては適当でない要素があったりするので(今回の例でいうと、検索結果の上下に入っているナビゲーション部分)、それを排除するために単純にHTMLツリーの差分を取って差分の小さいものだけにマッチするようにしています。この処理は重たいのでなんとかしたいところです。
取り出したい部分が、ひとつのページに何回か繰り返されているような構造になっていればmozillaZine 日本語版のように、ひとつひとつのparagraphがみためではすごく大きいものでもみたいなものでもうまく取り出すことができます。
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/206
comments