javascriptで質問です。以下のようなことが出来るのであれば手順を教えてください。できればサンプルをお願いします。関連したURLでもOKです。


1. Windowsのコマンドラインからファイルに記録されたjavascriptを実行する。
2. そのscriptでパラメータで渡されたURLにアクセスし、HTMLを取得する。
3. 取得したHTML内の要素に対してjquery(#IDなどをつかって)を使ってアクセスし文字列処理を行う。
4. 結果をサーバ側にデータをPOST
 (無理だと思うのですがローカルのファイルに直接出力できるとなおよろし)

端的にいうとjavascriptとjqueryライブラリ(または似たようなもの)をつかって
HTMLの要素にアクセスし、整形するようなスクレーピング?プログラムを
作成したいということです。
(DOMアクセスできるものがあるのですがjqueryのような扱いやすさがないので)
*windowsコマンドラインで動くものであればmshta.exeでなくともかまいません

回答の条件
  • 1人5回まで
  • 登録:2009/12/03 13:25:48
  • 終了:2009/12/03 16:35:36

ベストアンサー

id:mattn No.3

mattn回答回数104ベストアンサー獲得回数232009/12/03 15:50:02

ポイント50pt

id:hasegawayosuke変態スクリプトを使うと出来ます。

  • hasegawayosuke-daisuki.js
// ユーティリティ関数
var _util = { cat : function(f){return (new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile(f,1,false).ReadAll();} };
// 偽 window、偽document、グローバルオブジェクトの準備
(function(){
    if( typeof( document ) == "undefined" ){
        document = new ActiveXObject( "htmlfile" );
        document.write("<html></html>");
    }
    if( typeof( window     ) == "undefined" ) window = document.parentWindow;
    if( typeof( alert      ) == "undefined" ) //alert = window.alert; 
        alert = function(s){ return window.alert( s )};
    if( typeof( confirm       ) == "undefined" ) confirm = function(s){ return window.confirm(s) };
    if( typeof( location      ) == "undefined" ) location = window.location;
    if( typeof( navigator     ) == "undefined" ) navigator = window.navigator;
    if( typeof( clearInterval ) == "undefined" ) clearInterval = function(id){
        return window.clearInterval( id );
    };
    if( typeof( clearTimeout  ) == "undefined" ) clearTimeout = function(id){
        return window.clearTimeout(id);
    };
    if( typeof( setInterval   ) == "undefined" ) setInterval = function(code, interval){
        return window.setInterval(code, interval);
    }
    if( typeof( setTimeout    ) == "undefined" ) setTimeout = function(code, delay){
        return window.setTimeout(code, delay);
    }
})();

// jQueryの読み込み
eval( _util.cat( "jquery-1.3.2.js" ) );

var complete = 0;
$.ajax( {
	url : "http://q.hatena.ne.jp/1259814347",
    dataType : "text",
    type : "get",
    async : true, 
    success : function( text ){
		alert($('h1.question-header', $(text)).text());
        complete = 1;
    }
} );

for( var i = 0; i < 100; i++ ){
    WScript.Sleep( 30 );
    if( complete == 2 ) break;
}

コマンドプロンプトから

C:\>cscript hasegawayosuke-daisuki.js

とすると、このページの質問文がスクレイピングされメッセージボックスで表示されます。

※スクリプト名は気にしないで下さい。

id:neozerocool

仮想htmlファイルを作成してそこにjQueryを流し込んでいるということですよね。

これだとjQuery以外にも流し込めそうなんでいろいろと幅が広がりそうです。

んー 目からうろこでした。

ありがとうございました。まさしくドンピシャです。

2009/12/03 16:28:50

その他の回答(3件)

id:HALSPECIAL No.1

HALSPECIAL回答回数407ベストアンサー獲得回数862009/12/03 13:53:52

ポイント10pt

WSH(Windows Scripting Host)で実現できます。

言語は、VBScriptまたはJScriptです。

前者は拡張子がvbs、後者はjs

1.

コマンドラインからたたくには、

http://d.hatena.ne.jp/seiunsky/20081130/1228066957

cscript test.js 1 aiueo "引数"

のようにします。


2.

HTMLを取得するには、

XMLHttpRequest オブジェクトを使用します。

http://webos-goodies.jp/archives/50548720.html


3.jquery の使用は難しいでしょう。

できないとは言い切れないので明言は避けます。

それと、HTMLのDOMをパースできるかどうか不明です。XMLなら可ですが。


4.

XMLHttpRequest オブジェクトでPOSTすればいいです。

また、WSHなので、ローカルのリソースにアクセスできるので、ファイルに保存も可能です。

id:neozerocool

ご回答ありがとうございます。

はやり 3.のHTML部分のDOMのパースが苦労する部分だと思っていたので

この部分をjqueryにこだわっているわけではないのですが、なんか直感的

にアクセスできるようなライブラリがあればいいのですが・・・

引き続き情報お待ちしております。

2009/12/03 14:06:37
id:HALSPECIAL No.2

HALSPECIAL回答回数407ベストアンサー獲得回数862009/12/03 14:12:39

ポイント15pt

Pure JavaScript HTML Parser

http://ejohn.org/blog/pure-javascript-html-parser/

こういうのでパースできそうです。

id:neozerocool

jqueryにこだわってないといいながらなんなんですが 上記感じだと使用する言語がjavascriptである必要がなくなってきてしまいますかね。

PHPや他の言語でもhtmlparserがあったりするのですが、どれもいまいちすっきりしなくて

あとのっかりですが

1.で呼び出すjsファイル内からprototypeやjqueryなど呼び出すことはできますでしょうか?

2009/12/03 15:21:32
id:mattn No.3

mattn回答回数104ベストアンサー獲得回数232009/12/03 15:50:02ここでベストアンサー

ポイント50pt

id:hasegawayosuke変態スクリプトを使うと出来ます。

  • hasegawayosuke-daisuki.js
// ユーティリティ関数
var _util = { cat : function(f){return (new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile(f,1,false).ReadAll();} };
// 偽 window、偽document、グローバルオブジェクトの準備
(function(){
    if( typeof( document ) == "undefined" ){
        document = new ActiveXObject( "htmlfile" );
        document.write("<html></html>");
    }
    if( typeof( window     ) == "undefined" ) window = document.parentWindow;
    if( typeof( alert      ) == "undefined" ) //alert = window.alert; 
        alert = function(s){ return window.alert( s )};
    if( typeof( confirm       ) == "undefined" ) confirm = function(s){ return window.confirm(s) };
    if( typeof( location      ) == "undefined" ) location = window.location;
    if( typeof( navigator     ) == "undefined" ) navigator = window.navigator;
    if( typeof( clearInterval ) == "undefined" ) clearInterval = function(id){
        return window.clearInterval( id );
    };
    if( typeof( clearTimeout  ) == "undefined" ) clearTimeout = function(id){
        return window.clearTimeout(id);
    };
    if( typeof( setInterval   ) == "undefined" ) setInterval = function(code, interval){
        return window.setInterval(code, interval);
    }
    if( typeof( setTimeout    ) == "undefined" ) setTimeout = function(code, delay){
        return window.setTimeout(code, delay);
    }
})();

// jQueryの読み込み
eval( _util.cat( "jquery-1.3.2.js" ) );

var complete = 0;
$.ajax( {
	url : "http://q.hatena.ne.jp/1259814347",
    dataType : "text",
    type : "get",
    async : true, 
    success : function( text ){
		alert($('h1.question-header', $(text)).text());
        complete = 1;
    }
} );

for( var i = 0; i < 100; i++ ){
    WScript.Sleep( 30 );
    if( complete == 2 ) break;
}

コマンドプロンプトから

C:\>cscript hasegawayosuke-daisuki.js

とすると、このページの質問文がスクレイピングされメッセージボックスで表示されます。

※スクリプト名は気にしないで下さい。

id:neozerocool

仮想htmlファイルを作成してそこにjQueryを流し込んでいるということですよね。

これだとjQuery以外にも流し込めそうなんでいろいろと幅が広がりそうです。

んー 目からうろこでした。

ありがとうございました。まさしくドンピシャです。

2009/12/03 16:28:50
id:hasegawayosuke No.4

はせがわよすけ回答回数4ベストアンサー獲得回数02009/12/03 16:05:26

ポイント15pt

↑のid:mattnの回答のコードは http://d.hatena.ne.jp/hasegawayosuke/20090930/p1 にあります。

あと、jQuery や DOM の操作をせずに、HTML文字列をパースしたいというのであれば、jQueryの作者である John Resig 氏による Pure JavaScript HTML Parser もあります。

id:neozerocool

ありがとうございます。参考にします。

2009/12/03 16:31:27

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません