トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Rhino:envjsでpreタグが含まれるページをパースすると途中で切れる

Last-modified: 2013-08-24 (土) 02:14:21 (3897d)
Top / Rhino:envjsでpreタグが含まれるページをパースすると途中で切れる

Rhino:envjsでpreタグが含まれるページをパースすると途中で切れる

Rhinoでenvjsをつかってpreタグが含まれるページをパースすると、preタグのところで出力が切れてしまいます。

原因は、envjsのバグで、チケットにも登録されていました。

しかし、改修はされていないようです、、、

今回は、Webページ(このWiki)をスクレイピングすることを目的としてるので、以下のコードのとおり、<pre>タグを<p>タグに置換することで、事象を回避しました。

コード

実行するためには、Rhino+envjs+jQueryの環境で実行する必要があります。

実行するためのJavaのコードはこちらを参照

■sample3.js

function sample(url){
	url = 'http://www.hiihah.info/index.php?Mahout%EF%BC%9A%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB2%EF%BC%9A%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0';
	window.location = url;

	// envjsで取得した<pre>タグが入っているコンテンツをそのまま出力
	print('NG出力#############################################################');
	print($('#body').text());

	// jQueryのajaxで取得した場合
	var res = $.ajax({
		url: url,
		async : false,
	});
	print('NG出力#############################################################');
	print($(res.responseText).find('#body').text());

	// <pre>タグを<p>タグに置換して出力するとちゃんと出力される。
	print('OK出力#############################################################');
	result = $(res.responseText.replace(/<pre>/g,'<p>').replace(/<\/pre>/,'</p>')).find('#body').text()
	print(result);

	return result;
};

具体的には

  • window.locationで読み込んだデータは×
  • ajaxで読み込んで、そのままjQueryオブジェクトを生成しても×
  • ajaxで読み込んで、テキストの状態でpreタグをpタグに置換してjQueryオブジェクトを生成したらOK

まあ、Rhino上でjQueryを実行する際に、domまわりはenvjsを使用しているから、こうなるんだよねw