エラー対応は難しい

「ウェブページまるごと取得ツール (WebGet)」というのを以前作ったのですが、ふと思いついて、Perlで同じ機能を作ってみたら、なんと一晩でできてしまいました。 まあ、ダイアログボックスでいろいろ設定するところが、変数に直接代入するようになっているなど、手を抜けるところは大幅に抜いているのですがね。 そうは言っても、設定部分は独立したパッケージにまとめているので、間違って変なところを書き換えてしまわないようにはなっています。

こんなに手軽に作れた理由のひとつは、HTMLの構文解析ライブラリーが最初から用意されていたことです。 そしてまた、文字列をちまちまと解析していく処理の記述能力では、正規表現の機能が充実したPerlにC++はたちうちできないのですな。

実は、某ウェブサイトからWebGetしようとしたら、その中のあるページからのリンク先をうまく認識できないようだったのです。調べてみたら、その先頭近くに、次のようなタグがありました。

        <style type="text/css"">

引用符が誤って2つつながっていた、ということで、そのあとの部分を文字列と解釈してしまい、リンクを表すタグを認識できなかったわけです。 構文エラーなんだから結果がどうなったって知らん、と言ってもいいようなものですが、どうも気持ち悪い、かといって、エラー時の振る舞いまで何かのブラウザーに合わせようってのもめんどくさい...

で、Perlの構文解析ライブラリーはその辺をちゃんとやってるのではないか、と期待してみた訳です。 説明を読むと、HTML規格に従えば正しくないにもかかわらず、註釈の扱い方は、Netscape Communicatorなんかと同じにしてあるようなのです(デフォルトの場合)。 ということは、この構文解析アルゴリズムをそのまま利用すれば、規格違反のHTMLファイルでももっともらしく解釈できる訳ですな。 試してみると、先ほどの引用符が間違っているタグは、タグではなくてテキスト部分と解釈されるようです。 ん?  ということは、Netscape Communicatorと解釈が違うのですね。

でもまあ、せっかくだからPerlで実装してみようか、という気になったら、あっさりできてしまったのでした。 それで、という訳でもないのですが、WebGetの方はまだそのままです。