[[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