さいきんlibxmlでHTMLを読み込んでXPathで要素を取り出すのが一部([xml][libxml2][c]XMLをHTTPで取得して、XPathで指定された中身をC言語で取り出す方法 - グニャラくんのグニャグニャ備忘録@はてな)ではやっています。
これにちょっと癖があってはまりました。<html><body>
<ul id="list">
<li>hello</li>
<li>world</li>
</ul>
</body></html>
こういうHTMLファイルを読み込んで id("list")/li というXPathを評価させるとなぜか何にもマッチしないのです。でもこれを //*[@id="list"]/li に置き換えるとhelloとworldを囲んでいるliふたつにマッチするようになるので、パース自体は問題ないようです。
で、いろいろいじっていたらなんでもいいのでHTMLにDOCTYPEをいれるとid関数が使えるのに気がつきました。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><body>
<ul id="list">
<li>hello</li>
<li>world</li>
</ul>
</body></html>
にするとid("list")/liでliふたつがマッチするようになりました。
Module HTMLparser from libxml2にはthis module implements an HTML 4.0 non-verifying parser with API compatible with the XML parser ones.
と書かれていて、ベリファイしないけどHTML4.0のパーサというのがどういう意味なのかわかりませんが(HTML4.0で定義されている要素であれば、その論理構造を考慮した上でwell-formedにしてくれるということでしょうか)、とりあえずid関数が使えるようになりました。
comments