f8g

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 も使えなくなったりしてよく分からない挙動をする。
何かもっと楽な方法ありそうなんだけどな。