• ベストアンサー

アクティブウィンドウから URL/HTML の取得

ローカルの(WindowsXP)環境で、アクティブなエクスプローラのウィンドウから URL や HTML を、 Perl (ActivePerl) でそのプログラム中に取り込むにはどのようにしたらよいのでしょうか。LWP, Win32::OLE などウェブで調べてみましたがわかりませんでした。ご教示いただけたら嬉しいです。 調べた限りでは Win32::OLE で以下のように出来そうだったのですがうまく行きませんでした。 use Win32::OLE qw(EVENTS in with valof); my $IE = Win32::OLE->GetActiveObject('InternetExplorer.Application') || Win32::OLE->new('InternetExplorer.Application', 'Quit'); $url = $IE->{Document}->{Url}; print "URL: " . $url . "\n";

  • Perl
  • 回答数4
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>Explorer に表示された検索結果から自分のほしい部分だけを抽出・整形し、Word file などに保存できたらいいなと 特別にPerlを使わなくてはならないという理由がないなら、 javascript(JScript)を使うといいと思います。 http://support.microsoft.com/default.aspx?scid=kb;ja;177241 に書かれている方法で、右クリックメニューを拡張することができます。 なので、 現在開かれているWebページを右クリックして該当プログラム(ローカルに作ったHTMLファイル)で 現在開かれているWebページの全てのリンクを取り出し、クリップボードに送り込むことが可能です。 サンプル(リンクの一覧をクリップボードにコピー)LinkAllCopy.html <SCRIPT LANGUAGE="JavaScript"> var pWin = external.menuArguments; var pDoc = pWin.document; var LinkList=""; for(var i=0;i<pDoc.links.length;i++){ LinkList+='<a href="' + pDoc.links[i].href + '">'; LinkList+=pDoc.links[i].innerText; LinkList+="</a>\n"; } window.clipboardData.setData('text',LinkList); </SCRIPT> ------------------------------------------------------------------- 取り出したリンクをスクリプトで選別処理することも当然可能です。 ActiveScriptを使っているのであれば、SCRIPT LANGUAGE="PerlScript"を使うことも可能であると思いますが、 特にこだわりがなければ、JScriptでできると思います。

rossgreen05
質問者

お礼

BLUEPIXY さん、ありがとうございます!Perl に特にこだわっていたわけではなく、ご教示いただいたようにしてリンクの情報を取り出すことが出来るようになり大変助かりました!! もうひとつだけ・・ HTML の全情報を取り出す Javascript のソースをお教えいただけたらとてもうれしいです。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>HTML の全情報を取り出す Javascript のソースをお教えいただけたらとてもうれしいです。 もうひとつ意味がわからないんですが、 文字通りの意味なら、「ソースの表示」でソースを取り出せばいいような気がします。 画面上に表示されるエレメントについては(IEの場合) docuement.ALL から引っ張ることができます。 body部分のソースは document.body.innerHTML とかでとれます。

rossgreen05
質問者

お礼

ご親切にお教えいただき本当にありがとうございました。自分でも調べてみて以下のように(ご回答のとおりですが)クリップボードに URL や Text, HTML を移すことが出来ました。 <SCRIPT LANGUAGE="JavaScript"> var pWin = external.menuArguments; var pDoc = pWin.document; var pBody = pDoc.body; var Url = pDoc.URL; var InnerHtml = pBody.innerHTML; var InnerText = pBody.innerText; window.clipboardData.setData('text',Url+InnerText+InnerHtml); </SCRIPT> これと Win32::Clipboard で思ったとおり(以上)のことができると思います。 use Win32::Clipboard; $CLIP = Win32::Clipboard(); print "Clipboard contains: ", $CLIP->Get(), "\n"; 重ね重ねご親切に感謝いたします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

多分、GetActiveObject('InternetExplorer.Application') で現在開いているIEが捕まえられていないと思う。 my $IE = Win32::OLE->GetActiveObject('InternetExplorer.Application') || Win32::OLE->new('InternetExplorer.Application', 'Quit'); $url = $IE->{Document}->{Url}; print "URL: " . $url . "\n"; を my $IE = Win32::OLE->GetActiveObject('InternetExplorer.Application'); if($IE){ $url = $IE->{Document}->{Url}; print "URL: " . $url . "\n"; } の様にしてみて何も表示されなかったら、捕まえるのに失敗しているということでしょう。 ハッシュが表示されていたのは、newしている方のせいだと思う。 単純にnewしてURLを開いたら良いんじゃないでしょうか

rossgreen05
質問者

お礼

まったくおっしゃられるとおりで、IE を捕まえられていませんでした。IE のバージョン (6.0....) のせいなのでしょうか。IE 設定はいろいろ変えてみましたが今のところだめでした。 >単純にnewしてURLを開いたら良いんじゃないでしょうか .pl ファイルをダブルクリックするだけで Explorer に表示された検索結果から自分のほしい部分だけを抽出・整形し、Word file などに保存できたらいいなと思っています。

rossgreen05
質問者

補足

XP SP2 にあてられた security patch がじゃまをしているようです・・解除をトライしましたがだめでした。 マニュアルでソースをコピペするしかないのかな・・・

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.1

どんな風にだめだったのですか? このスクリプトをコピー・ペーストして以下のように出力されましたが・・・ D:>ActiveURL.pl URL: http://bicniws.okweb.jp/kotaeru.php3?q=1696768

rossgreen05
質問者

お礼

補足と質問の追加です。スクリプトを以下のようにすると、 C:\>ActiveURL.pl Doc: HASH(0x284f50) URL: というのが返ってきます。ですので、Explorer にアクセスは出来ているようです。ところで、HASH(0x284f50) は展開すると HTML 情報が得られるのでしょうか。そうである場合、どのように展開したらよいのでしょうか。ご教示のほどお願いいたします。 use Win32::OLE qw(EVENTS in with valof); my $IE = Win32::OLE->GetActiveObject('InternetExplorer.Application') || Win32::OLE->new('InternetExplorer.Application', 'Quit'); $doc = $IE->{Document}; $url = $doc->{Url}; print "Doc: " . $doc . "\n"; print "URL: " . $url . "\n";

rossgreen05
質問者

補足

返信有難うございます。 C:\>ActiveURL.pl URL: というように、何も返ってこないんです・・ スクリプト自体の問題ではないということですね・・

関連するQ&A

  • Linuxでブラウザを開くスクリプトを書くには?

    WindowsでPerlからブラウザを開くスクリプトは以下の様にすれば実現できますが、Linuxの場合は、どのようにしたら良いのでしょうか? ブラウザは、Mozila5.0です。 あと、Linuxでは、use Encodingを使うとそのようなモジュールは無いと怒られます。ActivePerl特有のモジュールでしょうか?perlは共に5.8を使っています。 #use Encoding; use Win32::OLE; # オブジェクト生成。 my $ie = Win32::OLE->GetActiveObject('InternetExplorer.Application') || Win32::OLE->new('InternetExplorer.Application',sub {shift->Quit}) || die "InternetExplorer: ".Win32::OLE->LastError; $ie->{Visible} = 1; # Visibleに(見えるように)する。 # リクエストを投げてみる。 $ie->Navigate("http://www.yahoo.co.jp/"); while($ie->Busy){sleep 1; } # 待ちの秒数は適当

    • ベストアンサー
    • Perl
  • perlからのexcel読み込み

    お世話になります。 win7 ActivePerl 5.16.3 Apache HTTP Server 2.0 perlからエクセルファイルを読み込むプログラムを作成しています。 ---- use Win32::OLE; use Win32::OLE::Const 'Microsoft Excel'; Win32::OLE->Option(Warn => 3); eval{ Win32::OLE->GetActiveObject('Excel.Application'); }; if($@){ die "Excelが使用できません。$@"; } unless (defined $Excel){ $Excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}) or die "Excelが起動できません。"; } my $Book = $Excel->Workbooks->Open("Excelファイルのフルパス") or die Win32::OLE->LastError(); $Book->Close; $Excel->Quit(); ---- 現在は単純に、開いて、閉じるだけの状態です。 ワークシートが1つのエクセルファイルは問題ないのですが、 2つ以上ワークシートがあるエクセルファイルを開くと、$Book->Closeのところで戻ってこなくなります。(ブラウザで待機中の状態) 該当のエクセルファイルは、開いた状態です(直接エクセルで開いてみると編集のためロックされていますと出る)ので、Openは出来ているような気がします。 $Book->Closeを書かなければ下に流れていきますが、 プロセスが残ってしまいます。 ワークシートが1つのときと、複数のときで違いがあるのでしょうか?

    • ベストアンサー
    • Perl
  • perlでExcelを開くと強制終了してしまう

    activeperlでExcelのファイル(200ファイル位)を1ファイルずつ開いて、特定のセルの値を取得して、テキストファイルに出力をしています。 Excelファイルをオープンするときに、以下のエラーが表示されて、perlが強制終了してしまいます。 Can't call method "Worksheets" on an undefined value at hogehoge.pl line 143. 以下は問題の143行目 141 my $excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); 142 my $book = $excel->Workbooks->Open($fp); 143 my $sheet = $book->Worksheets(2); 現象としては、 Excelのファイル(200ファイル位)の特定のファイルで強制終了するわけではない。 よって、全てのファイルを正常に読み込んで終了する場合もある。 対策としては以下を実行していますが、あまり効果はないような感じです。 メモリを増強 1GB→2GB perlでExcelを処理中は他の動作をさせない(例えば、メールソフトを終了させておく) このエラーを回避する方法はあるものなのでしょうか? 完全に回避ができなくても、強制終了することなく、続行してくれるだけでも大変助かります。 以下に実行環境を記載します。 WindowsVista Business Service Pack 2 Intel Pentimum4 3GHz memory 2GB activeperl v5.10.1 Binary bulid 1006 perlでの使用モジュール use File::Find; use File::Basename; use File::Copy; use Date::Simple; use Cwd; use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::Variant; use utf8; use Encode; use File::Copy; use File::Path; 恐れ入りますが、ご回答を宜しくお願いします。

  • EXCELのファイルを別ファイルに保存する

    activeperlを使って、サーバ上のexcelファイルを名前を変更して、 別ファイルに保存したいですが、いい方法はありますでしょうか? 今作成したcgiのソースは下記です。 use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; my $excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit') || die "Excelが起動できません。"; my $book = $excel->Workbooks->Open('c:\Inetpub\excel\temp.xls') || die; my $sheet = $book->Worksheets('temp') || die; $book->SaveAs('C:\Inetpub\\excel\dest.xls'); $book->Close(); よろしくお願いします。

    • ベストアンサー
    • CGI
  • エクセルのセルからのデータ取り込み

    取り込んだセルのデータを使いたいのですが。。。 特定のセルの指定方法がわるのでしょか? ここが悪いと思ってますが、 ↓ print "$arrary[0][0]\n"; -------------------------------------------------------------- use strict; use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; $Win32::OLE::Warn = 3; # die on errors... my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); # get already active Excel # application or open new my $Book = $Excel->Workbooks->Open("C:\\DOCUMENTS\\test.xls"); # Excelのファイルをオープン my $Sheet = $Book->Worksheets(1); # ワークシート1を選択 my $array = $Sheet->Range("A8:B9")->{'Value'}; # 中身を取り出す $Book->Close; print "$arrary[0][0]\n";

  • PerlでMAPIについて

    WindowsのActivePerl5.6を使っています。 OutlookExpressの受信フォルダ内のメールを処理する Perlスクリプトを書こうしていますが、つまずいています。 my $Outlook = Win32::OLE->GetActiveObject('Outlook.Application') or die "なぜかエラー"; ここでエラーが発生します。 また、OutlookExpressの受信フォルダのメールのヘッダやメッセージを読む参考になるスクリプトはありますか?

    • ベストアンサー
    • Perl
  • Perl でワードファイルのヘッダーを取得する

    Perl でワードファイルのヘッダーを取得するには? perl, v5.10.0 windowsXP ワードファイル:word2003 <行いたいこと> C:\temp\word.doc のワードファイルのヘッダー(複数行)を取得したい。 <状況> インターネットでワードファイルの本文は取得できる例がありましたが、 ヘッダーを取得する方法がわかりませんでした。 下記のプログラムでは ・ワードのヘッダーは 0 が表示される。 ・ワードの本文は取得できて表示される。 (ヘッダーを表示しようといろいろしてみましたが、できていません) よろしくお願いいたします。 <プログラム> use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Word'; my $word = Win32::OLE->GetActiveObject('Word.Application') || Win32::OLE->new('Word.Application', 'Quit') || die; # 読み込み my $doc = $word->Documents->Open('C:\temp\word.doc') || die; my $headers = $doc ->ActiveWindow->ActivePane->View->{SeekView} = wdSeekCurrentPageHeader; ########## ヘッダー取得(→うまくいかない)########## print "$headers->{SelectionTypeText}\n"; #null foreach (in $headers) { print $_->{SelectionTypeText}->{'Text'} . "\n"; #null print $_ . "\n"; #0 print $_->{'Text'} . "\n"; #null print $headers . "\n"; #0 } ########## 本文取得(→OK)########## my $paras = $doc->Paragraphs; foreach (in $paras) { print $_->Range->{'Text'} . "\n"; } $doc->Close();

  • LWPモジュールでログインしHTML取得

    use LWP::UserAgent; use HTTP::Request::Common qw(POST); my $url = 'https://toto.netbk.co.jp/main/smm0100'; my %formdata = ('userName' => 'ID', 'loginPwdSet' => 'Pass'); my $request = POST($url,[%formdata]); my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0'); $ua->ssl_opts(verify_hostname => 0); my $res = $ua->request($request); print $res->as_string; サポートされないブラウザーで弾かれます 解決策、教えてください

  • 初心者に救いの手を

    perlを覚えてみようと思い立ち55歳で始めて見ました。 エクセルを操作しようと思い、 use Win32::OLE; と入れるとエラーになります。それ以外のコードは動いています。 さくらインターネットのレンタルサーバーを利用していますが、何か関係ありますか? ホームページで調べてもActivePerlをインストールすれば自動的に含まれているとなっていますが?何か大きな勘違いをしているのでしょうか? よろしくお願いします。

  • HTML::TreeBuilderについてです

    perlで特定のhtmlタグの情報を抜き出そうとしてHTML::TreeBuilderを使おうとしているのですが、インストールして実行してもlook_downメソッドがないといわれます。 しっかりとインストールはしているのであるはずなのですが・・・ どうすればよいか皆目見当もつかないのでどうぞよろしくお願いします。 ちなみにコードは以下の通りです↓ use strict; use warnings; use LWP::UserAgent; use HTML::TreeBuilder; use HTML::Element; use Encode; # urlを指定する my $url = 'http://www.nikkansports.com/'; # IE8のフリをする my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"; # LWPを使ってサイトにアクセスし、HTMLの内容を取得する my $ua = LWP::UserAgent->new; my $res = $ua->get($url); my $content = $res->content; # HTML::TreeBuilderで解析する my $tree = HTML::TreeBuilder->new; $tree->parse($content); $tree = decode("UTF-8",$tree); $tree = encode("Shift_JIS",$tree); # DOM操作してトピックの部分だけ抜き出す。 # <div id='topicsfb'><ul><li>....の部分を抽出する my @items = $tree->look_down('id', 'sideRanking')->find('li'); print $_->as_text."\n" for @items;

    • ベストアンサー
    • Perl

専門家に質問してみよう