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

解決


まる  2007-12-22 06:58:17  No: 29080

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

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


ばつ  2007-12-22 07:42:24  No: 29081

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


まる  2007-12-22 07:50:12  No: 29082

>ばつ様

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


それなら...  2007-12-22 07:54:55  No: 29083

OuterHTMLでしょ。


まる  2007-12-22 08:06:26  No: 29084

>それなら...様

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


ほんとに?  2007-12-22 08:55:30  No: 29085

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


KHE00221  URL  2007-12-22 09:28:07  No: 29086

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 09:34:04  No: 29087

>ほんとに?様

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


KHE00221  2007-12-22 09:45:27  No: 29088

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

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


まる  2007-12-22 10:20:28  No: 29089

>KHE00221様

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


KHE00221  URL  2007-12-22 10:54:59  No: 29090

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 13:47:06  No: 29091

>KHE00221様

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

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


KHE00221  2007-12-22 18:34:54  No: 29092

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


KHE00221  URL  2007-12-22 18:48:44  No: 29093

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 09:48:43  No: 29094

>KHE00221様

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


KHE00221  2007-12-23 18:48:14  No: 29095

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

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


まる  2007-12-24 09:43:21  No: 29096

>KHE00221様

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加