Safari Readerのコンテンツ抽出処理を調べる

Safari(とiOSのMobile Safari)にはReader機能というのがあって、ブログなどでコンテンツ部分だけを抜き出して表示してくれます。iOSにはあるのは知っていて、PC向けのページを読みやすくしてくれて便利なのでたまに活用していたのですが、PC版でもあるんですね。似た機能はPocketReadabilityにもあります。

でもこのリーダー機能、ボタンが出る時と出ない時があります。まあコンテンツ抽出ができない時は出ないんだろうなっていう推測はできるのですが、どのようにコンテンツ抽出しているのかなと。PerlのモジュールでHTML::ExtractContentというのがあるのですが、似たようなことやっているんだろうなって思っていましたが、しらべるとh1~h6の含まれるブロック要素で文字数が多いものが取られているっぽいとかブロックのサイズが云々とか色々観測結果が書かれていました。

しかし更に調べていくと、新事実が。Safari Reader Source Codeによれば、Safari ReaderはJavaScriptで実装されており、以下の手順を踏めばコードが読める。なんだってー。

  • Safariを一旦終了してブランクページを起動する
  • Readerが有効になるページを開く(ページ内のJavaScript次第でうまくいくページと行かないページが有りましたが、ここで例示されているページではうまくいきました)
  • ページがロードされ終わるのを待ち、WebKit Inspectorを開き、停止ボタンを一度だけ押す
  • リーダーボタンを押す

safari reader source Safari Readerのコンテンツ抽出処理を調べる

おお、よめた!

ということで、JavaScriptで書かれたコードを読むことができます。中を読むと要素のIDやClassに”article”、”body”、”content”、”entry”とか入っていたら可能性が高く、”comment”とか”advertisement”、”breadcrumb”、”disqus”とか入っていたら可能性が低いとか、縦横の表示サイズやエリア面積などなど様々なチェックを行っているようです。