前回のエントリで、WebArchive *archive = [[[webView mainFrame] dataSource] webArchive];
とすることでWebアーカイブを得ることができると書きましたが、これはOSXにおけるWebViewの話で、iOSのUIWebViewではそもそもWebFrameやWebDataSourceにアクセスできないのでこの方法ではWebアーカイブを取得できず、別の方法でやってやる必要があります。
というわけで、libxml2です。Webアーカイブはplistで、その構造もわかっているので、必要なのはWebページの周辺リソースを洗い出すことなわけですが、これをlibxml2でやってやります。libxml2はOSX/iOSの両方で利用でき、非整形なHTMLでもある程度パースできるので、XPathで外部リソースの在り処を探し出してplistにくるんでやれば一応Webアーカイブができ上がります。ちなみに今回は下の3つのXPath式で探すことにしました。
//img[@src] //script[@src] //link[@rel='stylesheet'][@href]
これで外部の画像、スクリプト、スタイルシートを探し出し、前回のエントリで紹介したフォーマットでアーカイブすれば完成です。
一応動くものをGitHubに置いておきました。 stake/STWebArchiver - GitHub
ただしこの方法には欠点があって、HTML本体から直接参照されているリソースしか取得できません。たとえば、img要素で埋め込まれている画像は取得できますが、CSSで指定されている画像は取得できません。要するに中途半端です。じゃあ使いどころがないかといえば、そんなこともないです。CSSで画像を使った派手な装飾がされていなくて、テキスト中心で、たまに本文中に画像が埋め込まれてるようなページ(InstapaperとかInstapaperとかInstapaperとか)をアーカイブする時なんかには普通に有用な気がします。
0 件のコメント:
コメントを投稿