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

Langage Delphi Discussion :

extraire une table d'un html


Sujet :

Langage Delphi

  1. #1
    Membre émérite
    extraire une table d'un html
    Bonjour

    J'ai un gros fichier html qui contient une table avec un id renseigné.

    J'ai besoin de récupérer les données de cette table pour en faire un CSV.

    Qu'est-ce que vous me conseillez comme méthode de lecture du fichier pour extraire cette table et récupérer les éléments ?
    Il faut que je récupére les titres dans les th et les valeurs dans les tr/td

    Je précise que pour générer le CSV , je me débrouille très bien :-)

  2. #2
    Rédacteur/Modérateur

    Bonsoir,

    Il faudrait un extrait pour être sûr,

    HTML, XML c'est quasiment la même chose
    - si tu peux ouvrir dans un TClientDataset, si ce n'est pas des données imbriquées, c'est gagné, matiné d'un FDBatchMove : bingo
    - plus complexe (données imbriquées) Le composant CDATA XML peut (peut-être) le faire

    Sinon, du bon vieux code
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre émérite
    Un TClientDataset ???

    Je n'y aurais jamais pensé.

    En attendant, j'ai cherché un peu et j'ai trouvé un bout de code tout simple qui remplit uns TStringGrid à partir du source HTML.
    Il faut savoir en quelle position est la table dans le fichier mais sinon ça fonctionne.
    J'aurais préféré un bon parser mais faute de grive ....

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
      i, j: Integer;
      ovTable: OleVariant;
    begin
      ovTable := WebBrowser1.OleObject.Document.all.tags('TABLE').item(1);
      for i := 0 to (ovTable.Rows.Length - 1) do
      begin
        for j := 0 to (ovTable.Rows.item(i).Cells.Length - 1) do
        begin
          StringGrid1.Cells[j + 1, i + 1] := ovTable.Rows.item(i).Cells.item(j)
            .InnerText;
        end;
      end;


    Je vais essayer cette solution du clientdataset parce que ça m'épate vraiment cette solution.

  4. #4
    Rédacteur/Modérateur

    Bonjour,

    Bon le soir en fin de boulot, j'ai toujours des idées qui peuvent être farfelues (quoique...)

    Citation Envoyé par Papy214 Voir le message

    Il faut savoir en quelle position est la table dans le fichier mais sinon ça fonctionne.
    pour le TClientDataset, il faudrait certainement faire de l'alagage de texte en amont, supprimer tout ce qui n'est pas la table (ou du moins faire en sorte que seule la partie table soit prise en compte) mais ce doit être possible et même peut-être remplacer les balises donc c'est peut-être pire qu'un bon parser

    J'aurais préféré un bon parser mais faute de grive ....
    Le bon vieux code a toujours ses adeptes

    En "m'amusant" avec les fichiers SVG j'ai fait plusieurs incursions pour parser ces fichiers (ce n'est que du HTML) et récupérer les données. IL faudrait que je retrouve mes notes mais je pense que j'ai du ouvrir quelques discussions car j'avais des problèmes avec certains attributs. Cela dit, il y a pas mal de HTMLparsers sur GitHub i.e. le premier à sortir https://github.com/sandbil/HTML-Parser
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre expérimenté
    j'ai lu quelque part que les composants JVCL contenaient un parser HTML, ça peut être une solution, sinon effectivement considérer le HTML comme du XML et utiliser TXMLDocument et un chemin vers le tag ayant l'ID recherché

  6. #6
    Membre émérite
    @sergio
    Merci pour le lien, je ne l'avais pas trouvé celui-là.

    @pprem
    Là je teste sur mon Sydney tout neuf et je n'ai pas encore installé la JVCL mais je vais regarder sur une autre version Delphi dans une VM.

    Pour la similarité entre HTML et XML, j'ai toujours eu des doutes sur le 100% entre les deux mais dans mon cas, il n'y a pas à aller très loin parce que les donnés à récupérer nesont pas imbriquées. Ca pourrait le faire.

    Merci à tous les deux, je teste ces solutions.

  7. #7
    Rédacteur/Modérateur

    Citation Envoyé par pprem Voir le message
    j'ai lu quelque part que les composants JVCL contenaient un parser HTML
    Exact TjvHTMLParser, je suis tellement concentré FMX que j'en oublie les JVCL.
    IL y a même un programme de démo
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  8. #8
    Membre émérite
    Je viens de tester le TXMLDocument sur la ce qui correspond à la table dans mon HTML et le premier chargement n'est pas une réussite.

    ---------------------------
    Notification des exceptions du débogueur
    ---------------------------
    Le projet lirehtml.exe a déclenché la classe d'exception EDOMParseError avec le message 'La balise de fin th ne correspond pas à la balise de début input.

    Ligne: 5
    </th>'.
    ---------------------------
    Arrêter Continuer Aide
    ---------------------------

    Pourtant, si j'ouvre le fichier avec cet extrait représentant uniquement la table, tout s'affiche sans problème (sans la mise en forme css évidemment).

    Sans préparation plus poussée de la source à analyser, on dirait que ça coince.

  9. #9
    Membre émérite
    C'est parce que les navigateurs arrivent à compenser les erreurs de syntaxe dans le HTML.

    Ce code n'est pas valide mais les navigateur l'acceptent alors que TXMLDocument va chercher la balise </input>
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    <input type="text" name="firstname">


    Avec les applications Web modernes (genre MVC, ou MVVM), le code généré est généralement correct.
    Mais certains développeurs ajoutent parfois des balises manuellement et font souvent ce genre d'erreur notamment sur les balises <br><li><input> qui sont normalement autofermante (<br/><li .../><input .../>)

  10. #10
    Expert éminent sénior
    le problème avec XML c'est qu'il est plus stricte que HTML et tu vas avoir des tas d'erreurs de syntaxe

    il est parfois plus simple d'y aller à la hache

    si tu prends une fonction comme Explode, tu peux assez facilement extraire les parties HTML qui t'intéressent

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure analyse(const HTML: string);
    var
      ss: TArray<string>;
    begin
      ss := Explode(HTML, '<table id="matable">');
      ss := Explode(ss[1], '<tr>');
    ...
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

###raw>template_hook.ano_emploi###