トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Rhino:envjsでpreタグが含まれるページをパースすると途中で切れる のバックアップ差分(No.1)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[Java:Rhino:初めてのRhino]]
[[Rhino:envjsとjQueryをつかう]]

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

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

原因は、envjsのバグで、チケットにも登録されていました。
-http://envjs.lighthouseapp.com/projects/21590/tickets/176-cannot-parse-pre-tags

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

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


***コード [#p8e47cca]
実行するためには、Rhino+envjs+jQueryの環境で実行する必要があります。

実行するためのJavaのコードはこちらを参照
-[[Rhino:envjsとjQueryをつかう]]

■sample3.js
 function sample(){
 	url = 'http://www.hiihah.info';
 	window.location = url;
 
 	// envjsで取得した<pre>タグが入っているコンテンツをそのまま出力
 	print('NG出力#############################################################');
 	print($.(':root').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