FireFoxのHTMLパーサ

ブラウザのパーサは壊れたHTMLをてきとうに解釈しててきとうに表示してくれる。
たとえば


<ul></li>....</li></ul>

のように論理的におかしいものでも、だいたいは思ったとおりに表示されたりする。

が、XML::XPath::XMLParser のようなパーサは壊れているのは not well-formed というだけで相手にしてくれない。世の中にアップロードされているHTMLはおおむね not well-formed で(バリデータなんて誰もかけたしないのだ)、だから壊れているやつは事前に適当に解釈してあげてからパーサにかける必要がある。
そこでFireFoxに似た解釈をてきとうに実装しようと思ったものの、やつの解釈の方法は実に難解だ。


<ul id="unordered_list">
  <li>
    <a href="http://google.com/">google
    <div>search engine</div>
</ul>

こういう泣きたくなるようなソースを書いて $(”unordered_list”).innerHTML の中身を見てみると

<ul id="unordered_list">
  <li>
    <a href="http://google.com/">google</a>
    <div>
      <a href="http://google.com/">search engine</a>
    </div>
  </li>
</ul>

となっていることがわかる。
まったくアルゴリズムが推測できない。(こんなHTMLを書いてるほうの意図も推測できないが)

mozilla.orgで探すと mozilla/parser/htmlparser あたりが関係ありそう。
cvs -d :pserver:anonymous:anonymous@cvs-mirror.mozilla.org:/cvsroot co mozilla/parser/htmlparser でソースを取ってきて中身を見ると
mozilla/parser/htmlparser/src/nsElementTable.cpp にタグの親子関係、自動的にタグを閉じたりするか、等が定義されているようにみえる。みたかんじここでは not well-formed なものを適当に直す、まではやっていなそうだ。みちのりはとおい。


About this entry