2012-04-10 41 views

Respuesta

18

Puede utilizar la interfaz IPersistStreamInit y el método save para almacenar el contenido del navegador web en una secuencia.

Uses 
    ActiveX; 

function GetWebBrowserHTML(const WebBrowser: TWebBrowser): String; 
var 
    LStream: TStringStream; 
    Stream : IStream; 
    LPersistStreamInit : IPersistStreamInit; 
begin 
    if not Assigned(WebBrowser.Document) then exit; 
    LStream := TStringStream.Create(''); 
    try 
    LPersistStreamInit := WebBrowser.Document as IPersistStreamInit; 
    Stream := TStreamAdapter.Create(LStream,soReference); 
    LPersistStreamInit.Save(Stream,true); 
    result := LStream.DataString; 
    finally 
    LStream.Free(); 
    end; 
end; 
+0

funciona. muchas gracias. – Leadri

+0

¿Cómo podemos hacer que funcione de la manera REVERSA: SetWebBrowserHTML, reinyectando el código previamente extraído de nuevo a WebBrowser (o TEmbeddedWebBrowser). Imagino la siguiente situación: un componente memo obtiene el código fuente HTML con GetWebBrowserHTML, luego el usuario realiza algunos cambios en el código fuente, luego el código fuente cambiado se vuelve a inyectar en WebBrowser. ¡Esto sería un buen editor de HTML con una vista previa en tiempo real en el navegador! – user1580348

+1

Mejor: 'LStream: = TStringStream.Create ('', TEncoding.UTF8);' – user1580348

3

Esto se ha preguntado y respondido muchas veces en los foros de Embarcadero, con muchos ejemplos de códigos publicados. Busque los archivos.

El quid de la cuestión es que Navigate() a la URL deseada y esperar a que el evento OnDocumentComplete al fuego, a continuación, QueryInterface() la propiedad Document para la interfaz IPersistStreamInit y llamar a su método save(). Cree una instancia de objeto TStream, como TMemoryStream, envuélvala en un objeto TStreamAdapter y pase el adaptador a save(). Luego puede cargar el TStream en el TMemo según sea necesario.

4

Eso funciona bien también:

function GetHTML(w: TWebBrowser): String; 
Var 
    e: IHTMLElement; 
begin 
    Result := ''; 
    if Assigned(w.Document) then 
    begin 
    e := (w.Document as IHTMLDocument2).body; 

    while e.parentElement <> nil do 
    begin 
     e := e.parentElement; 
    end; 

    Result := e.outerHTML; 
    end; 
end; 
+0

incorrecto esto te dará la representación DOM del elemento 'document'. No será el código fuente HTML. – kobik

+0

Sí, tiene razón, lo estaba usando solo para analizar algunos datos disponibles en la fuente html y el uso de la representación DOM estaba bien para eso. –

+1

Votaré tu respuesta, es útil en cualquier caso. También utilizo un método similar en nuestra araña para manipular/analizar HTML desde un sitio web extranjero. – kobik

Cuestiones relacionadas