WWW::Mechanizeで携帯向けサイトを弄れない時はバージョン1.71以上に上げよう(もしくは自分でどうにかしよう)

T/O としてもいい記事ですが、まぁ一応説明を。

PerlのWWW::Mechanizeでサイトを弄る場合で、特に携帯電話(いわゆるガラケー)向けのサイトを弄る場合に、

  • フォームはきちんとHTML内に存在するのにsibmit_form()できない
  • title()でタイトルが取れない

とかいう不思議現象に遭遇することがあります。

これは、WWW::Mechanizeのis_html()メソッドが、Content-Typeとしてtext/html以外が返ってきた場合にはドキュメントをHTMLと見なさず、HTMLとしての解析を行わない事が原因です。携帯電話向けのサイトではContent-Typeとしてapplication/xhtml+xmlを返す事が有るため、この仕様にバッチリとハマり、前述の問題が起こるわけです。 本来xhtmlなドキュメントの場合はtext/htmlではなくapplication/xhtml+xmlを返すのが正しいので、普通のPC向けサイトでもこの事は起こりえるのですが、携帯向けサイトはContent-Typeを厳密に設定する傾向があり(でないと携帯電話が解釈してくれない)、この問題に遭遇しやすいようです。ってか、一般のPC向けサイトで、今日日xhtmlを正しく運用してる所をほとんど見た事がないですね…。

で、解決方法としては、

  • WWW::Mechanizeの1.71でContent-Typeがapplication/xhtml+xmlでもhtmlと見なすように修正が入ったので、これ以降のバージョンにWWW::Mechanizeをバージョンアップする
  • あるいは、自分でWWW::Mechanizeのis_htmlメソッドを上書きする

のどちらかとなります。私は最初新しいバージョンで直っている事に気付かず後者でやりましたが、まあ出来るだけ前者で対応した方が良いと思います。「モジュール内のメソッドをモジュールの外から上書きする」というのはとても黒魔術チックなので…。