HTMLソースを取得するには?

解決


まる  2007-12-21 21:58:17  No: 29080  IP: 192.*.*.*

はじめまして、よろしくお願いします。
WebBrowserで表示しているページからHTMLソースを取得するにはどうすればいいのでしょうか?

Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.innerHTML;を用いて取得してこようと試みたのですが、HTMLソースの一部のみ取得してきているようで、HTMLソース全部を取得することができません。
HTMLソースをすべて取得するにはどのような方法があるのでしょうか?

編集 削除
ばつ  2007-12-21 22:42:24  No: 29081  IP: 192.*.*.*

>HTMLソースをすべて取得するには...
「すべて」というのは、どこからどこまで?

編集 削除
まる  2007-12-21 22:50:12  No: 29082  IP: 192.*.*.*

>ばつ様

<html>から</html>までを取得してきたいのです。
何かアドバイスありましたら、よろしくお願いします。

編集 削除
それなら...  2007-12-21 22:54:55  No: 29083  IP: 192.*.*.*

OuterHTMLでしょ。

編集 削除
まる  2007-12-21 23:06:26  No: 29084  IP: 192.*.*.*

>それなら...様

アドバイスありがとうございます。
OuterHTMLも試したのですが、OuterHTMLでは<body>の部分が抜けてしまうのです。
私が取得したいのは、googleの検索結果のHTMLソースなのですが、、
HTMLソースをすべて取得できない状態なのです。
ほかに何かアドバイスありましたらよろしくお願いします。

編集 削除
ほんとに?  2007-12-21 23:55:30  No: 29085  IP: 192.*.*.*

> ...<body>の部分が抜けてしまうのです。
innerHTMLでもOuterHTMLでも そんなことないよ。

編集 削除
KHE00221  URL  2007-12-22 00:28:07  No: 29086  IP: 192.*.*.*

INNER は <HEAD> から OUTER は <HTML> から取れるけどね

IEのバージョンによってそんなバグでもあるのかな?

WebBrowser を使わなくても良いのなら

StringList.Text :=  IDHTTP1.Get('http://www.google.co.jp/search?hl=ja&q='+HTTPEncode(Edit1.Text)+S+S2);

なんてやりかたでも HTML を取得する事はできますが

https://www.petitmonte.com/bbs/answers?question_id=5234

みたいのを作ろうとしているのかな?

編集 削除
まる  2007-12-22 00:34:04  No: 29087  IP: 192.*.*.*

>ほんとに?様

私が行った結果なのですが、innerHTML、OuterHTMLの両方ともHTMLソースの一部分が抜けてしまっています。
どのようなことが原因なのでしょうか?
環境等も関係しているのでしょうか!?
質問ばかりですみませんが、アドバイスいただけるとありがたいです。

編集 削除
KHE00221  2007-12-22 00:45:27  No: 29088  IP: 192.*.*.*

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
        Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.innerHTML;
end;

この中で取得していないとか?

編集 削除
まる  2007-12-22 01:20:28  No: 29089  IP: 192.*.*.*

>KHE00221様

アドバイスありがとうございます。ご指摘頂いた通りでした。
本当に初歩的なミスを起こしてしまいすみませんでした。
KHE00221様が書いていたURLのページは以前参照させてもらいました。
やりたいことはよく似ています。私も検索結果からURLのみを取得したいと思っています。
URLのページに記載していましたプログラムは、ディスク上に保存した google の検索結果を対象にしているようですが、
Memo1.Text:=WebBrowser1.OleObject.Document.documentElement.innerHTML;
で取得したHTMLソースでも実行できるのでしょうか?
IEから取得したものと記述が少し違っている様なのですが・・・
何かアドバイス等ありましたら、よろしくお願い致します。

編集 削除
KHE00221  URL  2007-12-22 01:54:59  No: 29090  IP: 192.*.*.*

http://khe00221.image.coocan.jp/index.php?FrontPage%2FApplication%2FGoogle%B8%A1%BA%F7%28%A5%BD%A1%BC%A5%B9%C9%D5%A4%AD%29

からダウンロードしてごらん ソースついてるから

WebBrowserでなく IDHTTP で取得しているけど (googleの画面を表示する必要は無いので)

編集 削除
まる  2007-12-22 04:47:06  No: 29091  IP: 192.*.*.*

>KHE00221様

プログラム非常に参考になりました!!すごいですね。
確かにこのプログラムなら、googleの画面を表示する必要はないですね!

私の場合、WebBrowserをなんとか使ってURLを取得したいんですが、、
以前KHE00221様が記述しているプログラムは保存したHTMLからURLを取得してきていますよね?
J1 := PosEx('<h2 class=r>',S,Index);の部分からURLを取得するための処理を行っているのではないでしょうか!?
この部分を変更すれば、IEから取得したものと記述が違っていても、URLを取得することができないのでしょうか?
それか、IEと同じようなHTMLソースを取得する方法は何かないでしょうか?
図々しい質問ばかりで申し訳ありませんが、アドバイスお願い致します。

編集 削除
KHE00221  2007-12-22 09:34:54  No: 29092  IP: 192.*.*.*

そのままコピーして使用する事はできませんが、判定文字列を多少
変更すればタイトル、URLの取得する事は可能です

編集 削除
KHE00221  URL  2007-12-22 09:48:44  No: 29093  IP: 192.*.*.*

var
  URL,TITLE : array of String;
  Count,MaxCount : Integer;


procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL2: OleVariant);
var
    StringList : TStringList;
    I,I2,J1,J2,J3,J5,Index : Integer;
    S,S1 : String;
    F0,F1 : Boolean;
begin
    StringList := TStringList.Create;
    StringList.Text:=WebBrowser1.OleObject.Document.documentElement.OuterHTML;
    Count := 0;
    for I:=0 to StringList.Count -1 do
    begin
      Index := 1;
      S := StringList[I];
      F0 := False;
      while F0 = False do
      begin
        F0 := True;
        J1 := PosEx('<H2 class=r>',S,Index);
        if J1 <> 0 then
        begin
          J2 := PosEX('href="',S,J1+12);
          if J2 <> 0 then
          begin
            J3 := PosEx('">',S,J2+6);
            if J3 <> 0 then
            begin
              SetLength(URL,Count+1);
              S1 := Copy(S,J2+6,J3-J2-6);//URL 取得
              //同一のURLが登録されているか確認
              F1 := False;
              for I2 := 0 to Count-1 do
              begin
                if URL[I2] = S1 then F1 := True;
              end;
              //同一のURLが登録されていない場合
              if F1 = False then
              begin
                URL[Count] := S1;
                J5 := PosEx('</A>',S,J3+2);
                if J5 <> 0 then
                begin
                  //TITLE登録
                  SetLength(TITLE,MaxCount+1);
                  TITLE[Count] := Copy(S,J3+2,J5-J3-2); //TITLE取得
                  //TITLEから <b> と </b> を 削除
                  J1 := Pos('<B>',TITLE[Count]);
                  while J1 <> 0 do
                  begin
                    if J1<> 0 then
                    begin
                      TITLE[Count] := Copy(TITLE[Count],0,J1-1) + Copy(TITLE[Count],J1+3,Length(TITLE[Count])-J1-2);
                      J1 := Pos('</B>',TITLE[Count]);
                      if J1 <> 0 then
                      begin
                        TITLE[Count] := Copy(TITLE[Count],0,J1-1) + Copy(TITLE[Count],J1+4,Length(TITLE[Count])-J1-3);
                      end;
                    end;
                    J1 := Pos('<B>',TITLE[Count]);
                  end;
                  Index := J5;
                  F0 := False;
                end;
                Inc(Count);
                if MaxCount < Count then MaxCount := Count;
              end;
            end;
          end;
        end;
      end;
    end;
    StringList.Free;
end;

編集 削除
まる  2007-12-23 00:48:43  No: 29094  IP: 192.*.*.*

>KHE00221様

お返事が遅くなり申し訳ありません。プログラムまで記述して頂き本当にありがとうございます。
まだ頂いたプログラムを試せてはいないのですが、KHE00221様が書いていたURLのページのプログラムを参照しながらURLを取得してみたいと思います。
そのプログラムにも適用できると思っているのですが、、どうですか?
あと、今回書かれたプログラムの(J1+12)や(J2+6)の部分はどのような処理を行っているのでしょうか?この部分がよく理解できなくて。。
また質問ばかりですみませんが、よろしくお願い致します。

編集 削除
KHE00221  2007-12-23 09:48:14  No: 29095  IP: 192.*.*.*

PosEx('ABCDE',S)  は先頭の位置を返すので 

調べた文字数を足して文字の後ろから検索をかけているだけです

編集 削除
まる  2007-12-24 00:43:21  No: 29096  IP: 192.*.*.*

>KHE00221様

またお返事が遅くなりました。申し訳ありません。
頂いたプログラムを実行したところ、URLを取得することができました。
度重なる質問にも親切にお答え下さって、本当にありがとうございました。

編集 削除