GreaseMonkey では GM_xmlhttpRequest で他のページとってくるじゃないですか。で、onload して req.responseXML をとるなり req.responseText をとるなりするけど、どうにもこうにも not well-formed なページ (HTML とか) をとってきてノード検索するとき面倒くさいんですよ。responseXML はもちろん空だし、responseText はもちろんただのテキストだし。
で、なんとなく思いついたので以下のように解決するようにした。
GM_xmlhttpRequest({ method : "GET", url : i.href, onload : function (req) { // てきとーなエレメント作って突っ込む (ブラウザにパースさせる) var d = document.createElement("div"); d.innerHTML = req.responseText; // d を最初のコンテキストノードにして文書を XPath 検索 $X(".//foobar", d); }, onerror : function (req) { alert(req.responseText); } });
なんてキモイ!
問題点は application/xhtml+xml なページから not well-formed なページをとってくるっていう場合は使えないこと。なぜなら innerHTML が使えないから。でも殆どの場合 (というか殆どのページは) text/html なので問題ない感じ。はてなとかはてなとかはてなとか。
Firefox 1.5 からは application/xhtml+xml なページでも innerHTML 使えるみたいです。by yoko さん