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

Langage Delphi Discussion :

extraire une table d'un html


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut 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

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    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

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    @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

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    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
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    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

Discussions similaires

  1. [AC-2013] extraire une table au format .csv
    Par djibouli dans le forum Macros Access
    Réponses: 0
    Dernier message: 15/07/2014, 16h21
  2. [Python 2.X] extraire des informations depuis une table html
    Par overider dans le forum Général Python
    Réponses: 0
    Dernier message: 03/07/2014, 14h03
  3. extraire une table bdd et en faire un exel
    Par artichaudd dans le forum Langage
    Réponses: 26
    Dernier message: 04/12/2011, 12h08
  4. [AC-2007] extraire une table en fonction de la date de mise à jour
    Par SG2607 dans le forum VBA Access
    Réponses: 5
    Dernier message: 19/04/2011, 16h04
  5. extraire une table d'une base sql server 2000
    Par MAJIK_ENIS dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/04/2006, 22h13

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