いつもご指導ありがとうございます。
Delphiプログラムでインターネット上のWEBサービス(自作含む)を
利用したいと考えています。
その典型例として、Delphiでインタフェースを作り、
グーグルで検索した結果を次のように活用することを考えています。
a-1)TEditに検索ワードを入力し、
a-2)その単語をグーグルで検索する
a-3)検索結果をTStringListに保持してその後の処理をする
グーグルとのやり取りは、次のようにすると手軽に
実現できるかな?と考えました。
b-1)フォームにTWebBrowserを配置する
b-2)TWebBrowserでグーグル(www.google.co.jp)を表示する
b-3)グーグルページの検索用テキストボックス(name=q)にa-1)で
TEditに入力した単語を反映する
b-4)グーグルページの検索ボタン(name=btnG)をクリックする
b-5)表示された検索結果ページのHTMLソースを取得する
b-6)HTMLソース(文字列)から必要な検索結果部分を抜き出す処理をする
最後のb-6)はグーグルの表示結果を分析する必要がありそうですが、
b-1)からb-5)までは、グーグルに限らず他のWEBサービスでも
同様の処理になるかもしれないと感じています。
ただ、b-3),b-4)をどのように実現するかわかりません。
具体的には、次の処理になると思います。
c-1)DelphiでTWebBrowser上のテキストボックスに値を設定する
c-2)DelphiでTWebBrowser上のボタンをクリックする
c-1),c-2)をどのように実現できるか、ご指導いただけますか?
たぶん典型的な質問とは思うのですが、過去ログをTWebBrowserで検索しても
見つけることができませんでした。
どうぞ、よろしくお願いいたします。
以下は参考になりませんでしょうか?
NMURL1.InputString := Edit1.Text;
ShellExecute(Handle, nil, PChar('http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q=' + NMURL1.Encode), nil, nil, SW_SHOW);
deldel様ありがとうございます。
大変参考になりました。
動作確認と不具合調査のため、回答が遅れてしまいました。
申し訳ございません。
deldelさんにご指導いただいた方法を試して、別ウィンドウでIEが開き、
検索結果が表示されました。
引き続きb-5)を実現したかったので、TWebBrowserを使う方法を調べて実装
してみました。
その結果、TWebBrowser上に検索結果が表示されました!
ただ、HTMLソースをうまく取得できません。
次の記事を参考にしてみたものの、実行すると読み込みエラーが発生しています。
https://www.petitmonte.com/bbs/answers?question_id=1697
WEBで見かけた次のコードで試してみたところ、HTMLソースが取得できました。
ただ、HEADタグ内が返され、BODYタグが抜けてしまっているようです。
Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.outerhtml;
この点を解決するには、WebBrowser1.OleObject.Documentの部分の扱い方を勉強する
必要がありそうです。
検索してみたのですが、適当なキーワードなどがわかっていないためか、
うまく情報を見つけることができません。
よろしければ、正式な技術名やオススメのキーワードなど、ご指導いただけると幸いです。
ちょっと長いですが、ソースを添付させていただきます。
-----
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, NMURL, ShellApi, OleCtrls, SHDocVw;
type
TForm1 = class(TForm)
NMURL1: TNMURL;
Edit1: TEdit;
Button1: TButton;
WebBrowser1: TWebBrowser;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure WebBrowser1NavigateComplete2(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//deldelさんにご指導いただいた方法→別WindowでIEが開き検索結果が表示される
procedure TForm1.Button1Click(Sender: TObject);
begin
NMURL1.InputString := Edit1.Text;
ShellExecute(Handle, nil, PChar('http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q=' + NMURL1.Encode), nil, nil, SW_SHOW);
end;
//TWebBrowserを使う方法を試してみる
procedure TForm1.Button2Click(Sender: TObject);
var
URL: String;
begin
NMURL1.InputString := Edit1.Text;
URL := 'http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q=' + NMURL1.Encode;
//URLエンコードした結果を表示する
ShowMessage(URL);
//TWebBrowserで表示する
WebBrowser1.Navigate(URL);
end;
procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
//ページが読み込まれたら、Memo1にソースを表示したい
//HEADタグだけが表示される
Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.outerhtml;
//検索結果←<BODY>タグがない
{
<HTML><HEAD><TITLE>入力キーワード - Google 検索</TITLE>
<META http-equiv=content-type content="text/html; charset=UTF-8">
:
(中略)
:
</HEAD></HTML>
}
//一部の文字のみが表示される
//Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.innerTEXT;
//参考
//https://www.petitmonte.com/bbs/answers?question_id=1697
//読み込み違反エラーになってしまう
//Memo1.Text := WebBrowser1.OleObject.Document.Body.InnerText
end;
end.
WebBrowser はよくわからないのですが、以下のようにするとソースをファイルに落とせます。
表示はWebBrowserで行い、内容はファイルにこっそり保存してそれを読む、
というのはどうでしょうか?
uses UrlMon;
UrlDownloadToFile(nil, PChar('http://www.google.co.jp/search?hl=ja&q=aaa&btnG=Google+%E6%A4%9C%E7%B4%A2&lr='), PChar('C:\aaa.txt'), 0, nil);
TWebBrowserを使うことは必須なのでしょうか?
単にGoogleで検索した結果をTStringListへ入れるだけなら、
IndyのIdHTTPを利用すれば簡単にできます。
たとえば、フォームにMemoとEditを配置し、Editへ入力したデータをGoogleで
検索Memoへソースを表示するなら一行でできます。
Memo1.Text := IdHTTP1.Get('http://www.google.co.jp/search?hl=ja&lr=&q=' + Edit1.Text);
Google、Yahoo等であればWeb API、SOAPが利用可能なところもあるので、
そちらも一度調べてみてはいかがでしょうか?
deldelさん、ありがとうございます。
ご指導いただいたソースでファイルに落とすことができました。
取得したファイルを使い、目的の処理ができると思います。
ALさん、ありがとうございます。
ご指導いただいたソースで、Memo1にソースを取得できました。
これを使って目的の処理ができると思います。
当初の目的が達成できましたので、解決となりました。
次の課題に、b-6)のソースからタグを除去する作業があります。
これは次の疑問が解決できると、innerHTMLを使って簡単に処理できそうな気がしています。
> ただ、HEADタグ内が返され、BODYタグが抜けてしまっているようです。
>
> Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.outerhtml;
>
> この点を解決するには、WebBrowser1.OleObject.Documentの部分の扱い方を勉強する
> 必要がありそうです。
>
> 検索してみたのですが、適当なキーワードなどがわかっていないためか、
> うまく情報を見つけることができません。
>
> よろしければ、正式な技術名やオススメのキーワードなど、ご指導いただけると幸いです。
もし、補足情報などございましたら、引き続き書き込んでいただけると幸いです。
よろしくお願いします。
ツイート | ![]() |