IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

[TWebbrowser] Probléme pour récupérer la source [FAQ]


Sujet :

Web & réseau Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut [TWebbrowser] Probléme pour récupérer la source
    salut à tous
    j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyMemo.Text := MyWebBrowser.OleObject.Document.Body.InnerHTML;
    pour recuperer la source, cependant cela ne recuprer que la source du <body>, j'ai testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyMemo.Text := MyWebBrowser.OleObject.Document.HTML.InnerHTML;
    mais cela ne marche pas .
    Comment recuperer le code source entier et non pas selement le <body> ?
    merci d'avance

  2. #2
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    salut !

    J'avais trouvé la réponse à cette question sur delphi.about.com.
    Il y a une histoire de stream à utiliser, avec une interface etc.

    Dès que je retrouve le lien je te le fais savoir.

    [edit : voici le lien, jette un oeil à la fonction WB_SaveAs_HTML il y a tout ce qu'il faut !
    http://delphi.about.com/od/internetintranet/l/aa062904a.htm ]

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    merci, mais comment faire pour recuperer le code source pour qu'ensuite le code source soit traité avec des regex? de plus j'ai trouvé des regex en delphi avec
    Borland.Vcl.Types,
    System.Text, // StringBuilder
    System.Text.RegularExpressions; // RegEx
    mais sa ne marche pas je suis sous delphi 7
    il trouve pas les deux .dcu

  4. #4
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Ah je vois qu etu viens d'ajouter des infos lol !

    Sans trop m'avancer, vu la manière dont tu donnes les noms "d'unités", ça doit être du .NET non ?
    Si quelqu'un qui connait .NET pouvait confirmer ?

    En tout cas sous Delphi7, il n'y a rien de natif pour utiliser des expressions régulières.
    Cherche sur google une unité qui te permette d'en avoir le support. Eventuellement va voir ici :
    http://sjrd.developpez.com
    Il me semble que dans une de ses unités, SJRD a de quoi utiliser les expressions régulières.

    Sinon pour récupérer le code source de ta page, fais comme suit :

    Tu commences par utiliser le code vers lequel je t'ai donné un lien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    uses ActiveX;
    ...
    procedure RecupererContenu(WB:TWebBrowser; Lines: TStrings);
    var
      PersistStream: IPersistStreamInit;
      Stream: IStream;
      MemStream: TMemoryStream;
    begin
      if not Assigned(WB.Document) then
      begin
        ShowMessage('Document not loaded!');
        Exit;
      end;
     
      PersistStream := WB.Document as IPersistStreamInit;
      MemStream:= TMemoryStream.Create;
      try
        Stream := TStreamAdapter.Create(MemStream, soReference)
                  as IStream;
        if Failed(PersistStream.Save(Stream, True)) then
          ShowMessage('Echec de la sauvegarde')
        else
          Lines.LoadFromStream(MemStream);
      finally
        MemStream.Free;
      end;
    end;
    J'ai modifié le code pour que tu puisses passer en paramètre un TStringList, par exemple, ce qui te permettra de récupérer sous forme de string la source de ta page.

    Tu appelles cette procédure ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var Lines: TStringList;
    begin
      Lines := TStringList.Create;
     
      RecupererContenu(WebBrowser1, Lines);
     
      ShowMessage('Source de la page : ' + String(Lines.GetText));
    end;
    Le "ShowMessage(...)" est pour l'exemple, tu sais tout ainsi :
    Créer le TStringList, appeler la procédure, récupérer le contenu qui a été mis dans le TStringList.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    j'ai bien mis comme tu m'a dit mais cela ne marche pas, quand j'appuis sur le bouton, çà marque "source de la page :" et rien d'autre
    j'ai testé sur google.com et developpez.com

  6. #6
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Il y a un petit bug dans le code de Bestiol : Il a oublié qu'il faut remettre le TMemoryStream au début après avoir sauvegardé le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    procedure RecupererContenu(WB:TWebBrowser; Lines: TStrings);
    var
      PersistStream: IPersistStreamInit;
      Stream: IStream;
      MemStream: TMemoryStream;
    begin
      if not Assigned(WB.Document) then
      begin
        ShowMessage('Document not loaded!');
        Exit;
      end;
     
      PersistStream := WB.Document as IPersistStreamInit;
      MemStream:= TMemoryStream.Create;
      try
        Stream := TStreamAdapter.Create(MemStream, soReference)
                  as IStream;
        if Failed(PersistStream.Save(Stream, True)) then
          ShowMessage('Echec de la sauvegarde')
        else
        begin
          MemStream.Seek(0, soFromBeginning);
          Lines.LoadFromStream(MemStream);
        end;
      finally
        MemStream.Free;
      end;
    end;

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Pierre Castelain
    Il y a un petit bug dans le code de Bestiol : Il a oublié qu'il faut remettre le TMemoryStream au début après avoir sauvegardé le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    procedure RecupererContenu(WB:TWebBrowser; Lines: TStrings);
    var
      PersistStream: IPersistStreamInit;
      Stream: IStream;
      MemStream: TMemoryStream;
    begin
      if not Assigned(WB.Document) then
      begin
        ShowMessage('Document not loaded!');
        Exit;
      end;
     
      PersistStream := WB.Document as IPersistStreamInit;
      MemStream:= TMemoryStream.Create;
      try
        Stream := TStreamAdapter.Create(MemStream, soReference)
                  as IStream;
        if Failed(PersistStream.Save(Stream, True)) then
          ShowMessage('Echec de la sauvegarde')
        else
        begin
          MemStream.Seek(0, soFromBeginning);
          Lines.LoadFromStream(MemStream);
        end;
      finally
        MemStream.Free;
      end;
    end;
    sa marche ! merci beaucoup !!!

  8. #8
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    oups désolé !
    J'ai fait ça sans tester et j'ai effectivement oublié ce détail

    Bonne continuation, et merci Pierre ^^
    Bestiol.

  9. #9
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 25
    Points : 37
    Points
    37
    Par défaut
    salut,

    Pour récupérer l'ensemble du code HTML, header compris, on peut utiliser simplement ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.HtmlTmpDocumentComplete(Sender: TObject;const pDisp: IDispatch; var URL: OleVariant);
    var CurrentWB: IWebBrowser;
         CurrentWB := pDisp as IWebBrowser;
             // recuperation du code entier
         htmlcode.text:=(CurrentWB.Document as IHTMLDocument3).documentElement.outerhtml;
    J'ai eu quelques soucis avec la méthode utilisant les streams, de plus la fonction est fournie directement avec IE en utilisant l'objet IHTMlDocument3 ( voir aide sur le site msdn )

    ne pas oublier le MSHTML_TLB dans les uses..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/12/2005, 12h24
  2. LDAP - Problème pour récupérer l'uid
    Par sangei dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 16/11/2005, 13h56
  3. Réponses: 10
    Dernier message: 16/11/2005, 08h33
  4. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 17h49
  5. Problème pour récupérer la clé primaire
    Par caramel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2003, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo