Diggin 0.5.3リリース
(*注 現段階でpear install してもxmlnsの除去に関するバグは除かれません。(後述))
インストールは
pear install --alldeps --force http://diggin.musicrider.com/Diggin.tgz
です。
ただし、以前のバージョンを入れられていた場合、
pear uninstall __uri/Diggin_Scraper_Adapter_Htmlscraping
とアンインストールするようお願い致します。
前回お知らせした*10.5.0からの変更箇所について記述します。
バージョンが指し示してるとおり、大幅な追加の機能はありません。
http://code.google.com/p/diggin/updates/list
変更箇所としては、リビジョン125から192までが該当します。
ただし、Diggin_Scraper_Adapter_Htmlscrapingは別管理していました。
(一応、codereposにはcommitしてましたが、、)
ですが、openpearが登場したので、Diggin_Scraper_Adapter_Htmlscraping
はそちらに移行させていただきました。
http://openpear.org/repository/Diggin_Scraper_Adapter_Htmlscraping
また、レスポンスのエンコーディングのutf-8への自動変換処理については処理を抽出し、
Diggin_Http_Response_Encodingクラスとして新たにまとめています。
openpearへのcommitは、メソッド追加とテストコード追加などです。
HTMLScrapingとの変更点
細かい変更点はcommitログを見ていただくとして、
Diggin_Scraperでのsimplexmlを扱う上での挙動部分について書きます。
そもそも、Adapterと名づけてる割には、
HTMLScrapingクラスから継承などもせず(リクエストが含有されてたためやむなく)、
コピペプログラミングしてたDiggin_Scraper_Adapter_Htmlscrapingクラスですが、
simplexmlオブジェクトとしての取得結果が変わります。(そして修正しなければいけない箇所があります。)
tidy利用による極まれなエスケープ
実体参照の扱いについては、rcdtokyoのほうに記載がありますが、
http://www.rcdtokyo.com/etc/htmlscraping/
一度Simplexmlへの変換前に、実体参照をエスケープする必要があります。
ですが、今までは本家のHTMLScrapingもDiggin_Scraper_Adapter_Htmlscrapingもtidyでの整形処理後に
このstr_replace('&', '&', $responseBody);な処理を行っていたため、以下のような>
もしくは<をタグの文字列ではないと判断されるケース(?)の場合に
二重に変換されてしまう問題がありました。
<?php $html = <<<HTML <html><body>あああ>いいい</body></html> HTML; $config = array('output-xhtml' => true, 'wrap' => 0); $tidy = new tidy; $tidy->parseString($html, $config, 'utf8'); $tidy->cleanRepair(); $xhtml = $tidy->html(); $tidy->cleanRepair(); var_dump((string)$xhtml); //結果 //<body> //あああ<いいい //</body>
そのため、0.5.1移行の配布時のバージョンには、tidy処理実行前に&のリプレイス処理を行うということで変更を行っています。
(ソースのコメントに残してるとおり、これだけでは上手く実体参照を元に戻せないケースがあるような気もしましたが失念←えー)
xmlnsの除去(今後のパッケージ)
詳しくは、okonomiさんの日記詳細があるのでそちらをご覧いただきたいのですが、
http://d.hatena.ne.jp/okonomi/20090110/1231609376
xmlns削除に失敗している箇所があります。tidyのconfigの初期値を変更しようと思います。
今後の"Diggin"の予定&todo
- 当分の間は、追加のコンポーネントは考えていません。(Mechanize作りたいなあ)
- テストコード。テストコード。テストコード
- マニュアル。マニュアル。マニュアル。(なお、Diggin_Scraperについては関西勉強会発表後(←おい)にちょっとだけ書いてます*2
- Diggin_Scraperの見直し(staticしすぎだった。Diggin_Scraper extends Diggin_Scraper_Processとすれば、入れ子にDiggin_Scraperをできるなあとか)
- デモアプリの追加
なお、Digginではcodereposでもopenpearでもバグ修正なりコンポーネント追加なりテストコード追加
なりforkするなりデモ追加なりメソッド名変更なりをしてくれるとありがたいですし、どんどんやってもらって構いません。