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

Bibliothèques C++ Discussion :

Visiter un lien en C++ et traiter la page web comme du XML


Sujet :

Bibliothèques C++

  1. #1
    Lucas Panny
    Invité(e)
    Par défaut Visiter un lien en C++ et traiter la page web comme du XML
    Bonjour,

    Avant j'utilisais Delphi avec son composant TWebBrowser pour visiter un lien puis récupérer les liens, les images et autres objets de la page visitée mais vue la baisse d'utilisation de cet outil, je dois savoir le faire sur d'autres outils donc un départ à zéro
    Est-ce bien de traiter une page web comme du XML (utiliser DOM ou SAX) pour récupérer tous les liens c'est-à-dire <a></a>?
    Mais cela risque de ne pas marcher si la page n'est pas du XHTML mais de l'ancien HTML qui ne respecte pas les règles du XML?

    Je me demande pas s'il exite déjà des classes qui englobent le standard du HTTP d'abord et des classes qui traitent les pages web?

  2. #2
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Bonjour,

    Mais cela risque de ne pas marcher si la page n'est pas du XHTML mais de l'ancien HTML qui ne respecte pas les règles du XML?
    Je suis également de cet avis !

    Je me demande pas s'il exite déjà des classes qui englobent le standard du HTTP d'abord et des classes qui traitent les pages web?
    C'est effectivement plutôt comme ça que ça se passe en C++ : tu vas avoir une bibliothèque pour le réseau d'une part, et une pour l'analyse HTML d'autre part.
    Pour le réseau, je te conseille Boost.Asio (Boost est un ensemble de bibliothèque très utilisé par les dèv C++, primordial à mes yeux), à moins que quelqu'un d'autre te propose une lib un peu moins bas niveau.
    Pour le parsing de pages HTML, désolé, je ne connais rien qui fasse cela, je passe le relais à quelqu'un d'autre !
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Le problème est plutôt inverse...

    En HTML, on a la certitude qu'un lien sera une balise <a>, et l'on sait que, si on trouve name, c'est une ancre et si on trouve href, c'est un lien permettant de se rendre à l'adresse... Les autres paramètres donnés à la balise, les balises imbriquées ou dans lesquelles est imbriquée la balise de liens n'interviennent finalement que très peu

    En XML, toute balise peut être considérée comme lien, selon le xslt ou autre fichier "connexe"...

    Donc, tu a d'un coté (HTML) la "facilité" (<a> est un lien) et de l'autre la "difficulté" dans le sens où tu dois déduire quelle balise servira de lien selon un autre fichier (pas très compliqué, mais à faire quand même )

    Même si, pour obtenir le "bon" rendu, il faut gérer CSS pour le html

    Ensuite, il ne faut pas confondre le langage utilisé ( (X)HTML, XML) avec le protocole (HTTP)...

    Le premier sert à "créer" et à "lire" (interpréter) un document là où le second indique simplement comment deux ordinateur vont discuter entre eux pour le transfert de ces documents

    Les bibliothèques implémentant le protocole http, sont curl, curlpp ou une adaptation de n'importe quelle bibliothèque permettant de gérer les sockets (TCP) et les bibliothèque permettant de gérer le langages vont de tinyXml à...(il y en a une floppée).

    Enfin, il faut savoir que la plupart des bibliothèques graphiques fournissent des familles de classes qui sont capables d'un coté de gérer les connexions udp/tcp (dont les protocoles http et ftp) et d'un autre de gérer les fichiers xml et autres SGML (toutes évolutions confondues)...

    Elles présentent aussi souvent un composant équivalent au "TWebBrowser"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    En XML, toute balise peut être considérée comme lien, selon le xslt ou autre fichier "connexe"...
    De ce côté-là, en xhtml, tu es tranquille.

    Par contre, un parseur xml strict va se vautrer sur du html, et sur la plupart du xhtml que tu trouveras.

    Au final, s'il s'agit juste d'isoler les liens, je pense qu'une regexp est probablement la solution la plus simple à mettre en œuvre, et elle aura d'excellents résultats.

  5. #5
    Lucas Panny
    Invité(e)
    Par défaut
    Regexp (un pti lien vers un tuto c++ svp)! En effet, ça semble être la seule solution sure

    Je me demande s'il n'y a pas moyen d'utiliser les moteurs de rendu existants (il y a GECKO pour Firefox et TRIDENT pour IExplore)? Comme je l'ai dit, j'ai utilisé TWebBrowser de Delphi qui à travers ses requêtes HTTP, je vois User-Agent: Mozilla/3.0 (Compatible Indy Library) (donc utilisant un truc de Mozilla ?)

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Tiens, un petit tuto sur l'utilisation de boost.Regex : http://ram-0000.developpez.com/tutor...p/boost-regex/
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Lucas Panny
    Invité(e)
    Par défaut
    Merci pour le lien !

    Citation Envoyé par Lucas Panny Voir le message
    Je me demande s'il n'y a pas moyen d'utiliser les moteurs de rendu existants (il y a GECKO pour Firefox et TRIDENT pour IExplore)? Comme je l'ai dit, j'ai utilisé TWebBrowser de Delphi qui à travers ses requêtes HTTP, je vois User-Agent: Mozilla/3.0 (Compatible Indy Library) (donc utilisant un truc de Mozilla ?)

  8. #8
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Je me demande s'il n'y a pas moyen d'utiliser les moteurs de rendu existants
    Je pense que le plus simple, dans ce cas, c'est de piloter le QtWebkit qui est intégré à Qt 4.4 et +

    L'automation d'ie, il me semble que c'est pas mal la merde.

  9. #9
    Lucas Panny
    Invité(e)
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Je pense que le plus simple, dans ce cas, c'est de piloter le QtWebkit qui est intégré à Qt 4.4 et +
    QtWebkit un compromis mais y a-t-il d'autres trucs moins propriétaires?

  10. #10
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    QtWebkit un compromis mais y a-t-il d'autres trucs moins propriétaires?
    Qu'est-ce que tu entends pas "propriétaire" ?

    Pour le coup, qtwebkit est tout ce qu'il y a de plus libre maintenant (LGPL).

  11. #11
    Lucas Panny
    Invité(e)
    Par défaut
    D'accord pour le QtWebkit alors mais je dois donc apprendre à l'utiliser (je l'accusais de propriétaire du fait que cela appartient à Nokia)

    En gros, mon but c'est un robot qui surfe tout seul pour relever des infos du web!

  12. #12
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Alors oublie qtwebkit, parce qu'il te fera tout un affichage, dont j'imagine que tu n'as que faire.

    Regarde plutôt du côté de curl dans ce cas.

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 138
    Par défaut
    J'ai déjà fait un programme permettant de télécharger des fichiers par http (images et autres) de n'importe quel site en utilisant directement les sockets...

    J'ai aussi fait un programme qui peut transmettre des pages web et n'importe quel autre type de fichier à un navigateur.

    Donc le protocole http c'est pas très compliqué .

    Par ailleurs, si tu veux juste avoir des infos sur les liens qui se trouvent dans les pages ça me semble assez simple aussi...

  14. #14
    Lucas Panny
    Invité(e)
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Alors oublie qtwebkit, parce qu'il te fera tout un affichage, dont j'imagine que tu n'as que faire.

    Regarde plutôt du côté de curl dans ce cas.
    Oui, ça ne m'importe l'affichage résultant, juste son HTML et c'est là qu'on pourrait avoir un problème s'il y a du JavaScript plus précisément de l'AJAX dessus: la première page eue du premier coup est peut-être très différente de celle après exécution du script

    Citation Envoyé par Silverstone
    Donc le protocole http c'est pas très compliqué .
    Un petit exemple svp? Habitué à Delphi, j'avais toujours utilisé des composants tout fait, c'est pour cela que j'ai voulu testé qtwebkit, s'il y a d'autres?? curl c'est déjà bien et ça satisfait nombreux développeurs Linux, les utilisateurs sous Win ça manque

    Je me demande aussi donc Comment fonctionne Googlebot? Je n'ai pas l'intention d'en faire un, mon robot a un tout autre but (pédagogique)

  15. #15
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 220
    Par défaut
    Si vous voulez seulement récupérer les liens d'une page HTML, je ne sais pas le faire en C++ mais en DELPHI c'est si simple en cherchant seulement le balise <a href
    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
    30
    31
    32
    33
    procedure GetLinksInHTMLDoc(URL : string; Links : TStrings); 
    var HTTP : TIdHTTP; 
        Content, Link : string; 
        Position : integer; 
    begin 
      HTTP := TIdHTTP.Create(nil); 
      try 
        Links.Clear; 
        Content := HTTP.Get(URL); 
     
        Position := 0; 
        while True do 
        begin 
          Position := PosEx('href', Content, Position+1); 
          if Position = 0 then Break; 
          inc(Position, 4); 
          while (Position < Length(Content)) and (Content[Position] in [#0, #10, #13, ' ']) do inc(Position); 
          if Content[Position] <> '=' then Continue; 
          inc(Position); 
          while (Position < Length(Content)) and (Content[Position] in [#0, #10, #13, ' ']) do inc(Position); 
          if Content[Position] <> '"' then Continue; 
          inc(Position); 
          BeginPos := Position; 
          while (Position <= Length(Content)) and (Content[Position] <> '"') do inc(Position); 
     
          Link := Copy(Content, BeginPos, Position-BeginPos); 
          if (Link <> '') and (Links.IndexOf(Link) = -1) then 
            Links.Add(Link); 
        end; 
      finally 
        HTTP.Free; 
      end; 
    end;
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  16. #16
    bruce-willis
    Invité(e)
    Par défaut
    Il semble que la plupart des sites d'aujourd'hui sont en XHTML c'est à dire du XML correct
    Je remarque même le code source des pages de DVP commençant par: <?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

    Donc, on peut donc directement traiter une page web comme du XML non??

  17. #17
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Si le site est en XHTML, effectivement, les règles (entre autres de fermeture de balises telles que <br/> ou <img .. /> sont identiques à celles du XML...

    Mais tous les sites ne sont pas encore forcément en XHTML, et, en HTML, tu peux avoir les balises <br> ou <img..>...

    Il faut donc être prudent quant à savoir si, oui ou non, le fait de traiter du HTML comme du XML va passer la validation
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #18
    bruce-willis
    Invité(e)
    Par défaut
    Les sites XHTML utilisent bien du <img src="" /> et du <br />

    Mais en effet, tous les sites ne sont pas encore xhtml, peut-être ne traiter que les xhtml!!!! Je suis à la recherche de la statistique des sites xhtml/ancien html

Discussions similaires

  1. [PHP 5.4] Lien vers fichier PHP sans changer page web
    Par nicolas92c dans le forum Langage
    Réponses: 0
    Dernier message: 24/01/2015, 16h08
  2. lien vers une partie d'une page web
    Par logiclogic dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 17/02/2013, 16h44
  3. lien vers un popup d'une page web
    Par docblunt dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 09/04/2012, 17h47
  4. Liens ne marchant pas sur la page web
    Par xal64 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 09/07/2007, 13h58
  5. |VB6] Comment Lister les liens vers des fichiers d'une page web
    Par Mayti4 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 18/01/2005, 18h17

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