WSHでウェブページをHTMLDocumentで取得
いろいろ調べたけどあんまりうまくいかなかったりしたので、ちょっとややこしい方法。
ウェブページの取得
MSXML で。
var XmlHttp = WSH.CreateObject("MSXML2.XMLHTTP"); XmlHttp.open(method, url, false); XmlHttp.send(data);
文字コード変換
変換にはここの ADOS_Decode がそのまま使える。
http://homepage2.nifty.com/nonnon/SoftSample/VB.NET/SampleModADOS.html
function toUnicode(bytes, charset){ var stream = WSH.CreateObject("ADODB.Stream"); stream.Open(); stream.Type = 1; // ADODB.StreamTypeEnum.adTypeBinary stream.Write(bytes); stream.Position = 0; stream.Type = 2; // ADODB.StreamTypeEnum.adTypeText if(charset) stream.Charset = charset; var result = stream.ReadText(); stream.Close(); stream = null; return result; }
自動の精度があんまりよくない気がするので、文字コード判定。
var charset, matches; if(matches = XmlHttp.getResponseHeader("Content-Type").match(/charset=(.+)/)) charset = matches[1]; else if((matches = XmlHttp.responseText.match(/<meta[^>]+content="[^\"]+charset=([^>]+)"/))) charset = matches[1];
ADODB.Stream に Binary で流し込むので、 XmlHttp.responseBody を渡す。
toUnicode(XmlHttp.responseBody, charset)
HTMLDocument を作る
htmlfile から HTMLDocument を作る。この際、ソースに script タグがあると警告が出てくるようなので、その部分は消しておいた方がいい。
var source = this.toUnicode(XmlHttp.responseBody, charset) .replace(/(<script)|(<\/script>)/ig, "") .replace(/<\/title>/, [ '</title>', '<meta http-equiv="X-UA-Compatible" content="IE=edge" />' ].join("")); var document = WSH.CreateObject("htmlfile"); document.open(); document.write(source); document.close();
ちなみに
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
を設定すると IE の最新のバージョンで読み込む。IE8 が入っていれば Selector が使える、……かと思いきや使えない模様。 document.documentMode = 8 にはなるのに。あと、たまに eval も使えなくなったりしてよく分からない挙動をする。
何かもっと楽な方法ありそうなんだけどな。