在Http页面右健“查看源码”可以得到 Html 源码。
那么:
  在Delphi中给出一个URL, 那么怎么得到此URL页面的Html源码?

解决方案 »

  1.   

    用indyhttp.get(页面地址),应该可以得到
      

  2.   

    // Code 1uses
      ActiveX, MSHTML_TLB, ComCtrls, ComObj;function GetBrowserForFrame(Doc: IHTMLDocument2; nFrame: Integer): IWebBrowser2;
      //Thanks to Rik Barker
      //returns an interface to the frame's browser
    var
      pContainer: IOLEContainer;
      enumerator: ActiveX.IEnumUnknown;
      nFetched: PLongInt;
      unkFrame: IUnknown;
      hr: HRESULT;
    begin
      Result := nil;
      nFetched := nil;
      // Cast the page as an OLE container
      pContainer := Doc as IOleContainer;
      // Get an enumerator for the frames on the page
      hr := pContainer.EnumObjects(OLECONTF_EMBEDDINGS or OLECONTF_OTHERS, enumerator);
      if hr <> S_OK then
      begin
        pContainer._Release;
        Exit;
      end;
      // Now skip to the frame we're interested in
      enumerator.Skip(nFrame);
      // and get the frame as IUnknown
      enumerator.Next(1,unkFrame, nFetched);
      // Now QI the frame for a WebBrowser Interface - I'm not  entirely
      // sure this is necessary, but COM never ceases to surprise me
      unkframe.QueryInterface(IID_IWebBrowser2, Result);
    end;function GetFrameSource(WebDoc: iHTMLDocument2): string;
      //returns frame HTML and scripts as a text string
    var
      re: integer;
      HTMLel: iHTMLElement;
      HTMLcol: iHTMLElementCollection;
      HTMLlen: Integer;
      ScriptEL: IHTMLScriptElement;
    begin
      Result := '';
      if Assigned(WebDoc) then
      begin
        HTMLcol := WebDoc.Get_all;
        HTMLlen := HTMLcol.Length;
        for re := 0 to HTMLlen - 1 do
        begin
          HTMLel := HTMLcol.Item(re, 0) as iHTMLElement;
          if HTMLEl.tagName = 'HTML' then
            Result := Result + HTMLEl.outerHTML;
        end;
      end;
    end;function WB_SaveFrameToFile(HTMLDocument: IHTMLDocument2;
      const FileName: TFileName): Boolean;
    // Save IHTMLDocument2 to a file
    var
      PersistFile: IPersistFile;
    begin
      PersistFile := HTMLDocument as IPersistFile;
      PersistFile.Save(StringToOleStr(FileName), System.True);
    end;
    function SaveWBFrames(WebBrowser1: TWebBrowser): string;
    // return the source for all frames in the browser
    var
      Webdoc, HTMLDoc: ihtmldocument2;
      framesCol: iHTMLFramesCollection2;
      FramesLen: integer;
      pickFrame: olevariant;
      p: integer;
    begin
      try
        WebDoc := WebBrowser1.Document as IHTMLDocument2;
        Result := GetFrameSource(WebDoc);    // §§§ Hier kann Result in eine Datei gespeichert werden §§§§  oder  mit
        // WB_SaveFrameToFile(WebDoc,'c:\MainPage.html');    //Handle multiple or single frames
        FramesCol := WebDoc.Get_frames;
        FramesLen := FramesCol.Get_length;
        if FramesLen > 0 then
          for p := 0 to FramesLen - 1 do
          begin
            pickframe := p;
            HTMLDoc   := WebBrowser1.Document as iHTMLDocument2;        WebDoc := GetBrowserForFrame(HTMLDoc, pickframe).document as iHTMLDocument2;
            if WebDoc <> nil then
            begin
              Result := GetFrameSource(WebDoc);
              WB_SaveFrameToFile(WebDoc, 'c:\Frame' + IntToStr(p) + '.html');
              // ShowMessage(HTMLDoc.Get_parentWindow.Get_name);
              // ShowMessage(HTMLDoc.Get_parentWindow.Parent.Get_document.nameProp);        end;
          end;
      except
        Result := 'No Source Available';
      end;
    end;// Test:procedure TForm1.Button1Click(Sender: TObject);
    begin
      SaveWBFrames(Webbrowser1);
    end;
      

  3.   

    // Code 2
    uses
      ActiveX;function TForm1.GetFrame(FrameNo: Integer): IWebbrowser2;
    var
      OleContainer: IOleContainer;
      enum: IEnumUnknown;
      unk: IUnknown;
      Fetched: PLongint;
    begin
      while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
        Application.ProcessMessages;
      if Assigned(Webbrowser1.document) then
      begin
        Fetched := nil;
        OleContainer := Webbrowser1.Document as IOleContainer;
        OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum);
        Enum.Skip(FrameNo);
        Enum.Next(1, Unk, Fetched);
        Result := Unk as IWebbrowser2;
      end
      else
        Result := nil;
    end;// Load sample page
    // Testseite laden
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Webbrowser1.Navigate('http://www.warebizprogramming.com/tutorials/html/framesEx1.htm');
    end;// Save all frames in single files
    // Alle Frameseiten in einzelne Dateien speichern
    procedure TForm1.Button2Click(Sender: TObject);
    var
      IpStream: IPersistStreamInit;
      AStream: TMemoryStream;
      iw: IWebbrowser2;
      i: Integer;
      sl: TStringList;
    begin
      for i := 0 to Webbrowser1.OleObject.Document.frames.Length - 1 do
      begin
        iw := GetFrame(i);
        AStream := TMemoryStream.Create;
        try
          IpStream := iw.document as IPersistStreamInit;
          if Succeeded(IpStream.save(TStreamadapter.Create(AStream), True)) then
          begin
            AStream.Seek(0, 0);
            sl := TStringList.Create;
            sl.LoadFromStream(AStream);
            sl.SaveToFile('c:\frame' + IntToStr(i) + '.txt');
            //  memo1.Lines.LoadFromStream(AStream);
            sl.Free;
          end;
        except
        end;
        AStream.Free;
      end;
    end;end.
      

  4.   

    memo1.Text:=idhttp1.Get('http://www.zjrc.com');//这里可以换你要的urlidhttp在indy client面板里我同学也是做这个的
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      xWin:TShellWindows;
      i : integer;
    begin
      xWin := TShellWindows.Create(nil);
      for i := 0 to xWin.count - 1 do
      begin
        //showmessage(xWin.Item[i].LocaltionURL);
        showmessage((xwin.Item(i) as IWebbrowser2).LocationURL);
      end;
      xwin.Free;
    end;上面的代码遍历当前系统中打开的IE并且获得其IWebbrowser2接口,然后获得接口的LocationURL
    属性,你修改一下,通过IWebbrowser2.Document.Body.InnerHTML就可以获得某个IE窗口中打开
    的页面的HTML代码了。记得需要引用ShdocVW。
      

  6.   

    这类的问题已经有很多次了,你只要搜索一下就要以找到答案。
    用FastNet中的NMHttp控件或是Indy Clients中的IdHttp控件的GET方法都可以实现,
    不过GET方法不能通过Session的审核。也就是说,有些页面需登录审核,用这两个控件就会返回错误。如果不用审核,就可以得到你如说的,服务器端返回的HTML内容。
    当然用WebBrowser控件也可以,不过可能比较慢。
    例:
    ///////NMHTTP
      NMHttp1.Get("Url"); 
      memo1.text:=NMHttp1.body;//////Indy Http  ///Delphi6中新增加的控件,功能强大,推荐使用研究。
      Memo1.Text:=IdHttp1.Get("Url");/////Webbrowser
      Webbrowser.OleObject.Document.Documentelement.InnerHtml;//在Webbrowser 控件的OnDocumentComplete事件中调用.