PythonのhtmlパーサとWEBブラウザのパーサの違い

動物園・水族館のWEBサイトの更新情報のニュースサイトを作成している。

ここで、Pythonで書いた自作スクレイパーを使用しているのだが、中にはひどい構造のWEBサイトがあって、うまくデータを取得できていない。
そこで、動作速度の関係からまずはlxmlで読んでみて、それでうまくいかなかった場合のみbeautifulsopuで読み直すという処理になっている。

しかし、現実にはそのサイトはChromeを使えば何の問題もなく閲覧できているように見える。
その違いについて、ざっと調べたところ、以下のサイトが参考になった。

ブラウザの仕組み: 最新ウェブブラウザの内部構造

間違った入れ子構造や、間違ったbodyタグ、htmlタグの閉じがあった場合に、Webkitがどう動作するか詳しく解説されている。
簡単にエラーにするのではなく、寛容に解釈して処理を進めるようになっている。

lxmlはこういった場合、エラーを吐きつつ、そこで解析をストップさせてしまうので、結果がWebkitと異なって当然ということになる。

WEBサイトを作っている側は、IEだけか、頑張っているところでもFireFoxとChrome、Safariでの確認ぐらいしかしていないだろう。いちいちhtmllintで確認していたら、こんなに文法的にひどいサイトだらけになるはずがない。
というわけで、このWebkitの動作に関する資料はとても役に立つ。

具体的にlxmlでどうすればいいのかまでは、すぐには分からないが。

とりあえずこれで問題の解決に向けて一歩前進したといところだろうか。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

kazuyoshikakihara
2014年07月28日 21:06
ご丁寧な解析ありがとうございます。
結局、libxml2のパーサーが厳密すぎて、世の中の一般的なブラウザ(IE,Firefox,Chrome,Safari)が許容するHTMLであっても、lxmlでは許容されないってことが起こってしまうってことなんですよね。

この記事へのトラックバック