HTML::TreeBuilderで文字化けしたので検証した

https://retrip.jp/
をHTML::TreeBuilderで解析しようとすると文字化けしてしまう。
headタグのみ
titleタグのみ
など絞るとOKなのですが、
html全体
bodyタグ内
を取得しようとすると文字化けとなってしまいます。

 

HTML5だから?

まずソースを見てみて、ちょっと違うと感じました。
見慣れないタグ
header
footer
section
というタグがありました。
これがどうやらhtml5らしいです。恥ずかしながらよく知りませんでした。
というわけで、html5だからダメなのでしょうか?

そこでごくごく簡単なサンプル
http://html5.imedia-web.net/sample/html5_sample1/html5_sample1.html
を取得してみたところ正常に取得できました。
どうやら原因は違うようです。

 

ソース内に使用できない文字があるのでは?

経験的にパーサーでエラーになる場合は文字の泣き別れが多いです。
3バイト文字や2バイト文字が1バイトで切れ
表示しない1バイト文字、いわゆるNull文字が残っている場合です。
htmlをブラウザで見ているとまったく気が付かないのですが、パーサーで解析不能となり落ちてしまうのです。

これを検証するには、
ソースの半分を消して

解析

4分の1を消して

解析


を繰り返します。
こうやってどの部分が存在すると解析が不能になるのかを絞り込んでいきます。

 

原因発覚!

そしてこれを繰り返して・・・とうとう判明しました!

’

これが

次へ’’

となっていました。
これを消すと解析可能となりましたので、これで間違い無いようです・・・。

 

’ってなに?

記号>のようです。
本来>だと思うのですが、微妙に違う特殊文字なのでしょうか・・・。

 

対策は・・・?

HTML::TreeBuilderを使うのならこの;’を削除するしかないですね。。。

せっかくなので、他にもダメになる特殊文字を探してみようと思います。