PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Extraire des données à partir d'un fichier HTML
Extraire des données à partir d'un fichier HTML
Iniciado por Ambroise, 04,dic. 2019 20:59 - 18 respuestas
Miembro registrado
112 mensajes
Publicado el 04,diciembre 2019 - 20:59
Bonjour,
Soit un fichier HTML duquel je souhaiterai extraire des données. J'ai par exemple dans le fichier :
<tr>
<th class="libelle">Civilité :</th>
<td>Mme</td>
</tr>
<tr>
<th class="libelle">Prénom :</th>
<td>MARIE</td>
</tr>
<tr>
<th class="libelle">Nom :</th>
<td>ANTOINETTE</td>
</tr>

Or je n'arrive pas à récupérer les infos Mme, MARIE et ANTOINETTE pour alimenter mon formulaire.
J'ai tenté avec le code suivant :
nPositionDebut est un entier=0
nPositionfin est un entier=0

// Ouverture du fichier
nIDFichier = fOuvre(SC_SelecteurFichier_DS.SAI_FIC, foLecture)
SI nIDFichier <> -1 ALORS

nPositionDebut=fCherche(nIDFichier,">Civilité :</th>")
nPositionfin=fCherche(nIDFichier,"Nom et prénom(s) : </th> <td class=""rich-text""> <div> <p>",nPositionDebut)
Trace(nPositionDebut+" - "+nPositionfin)
// Fermeture du fichier
fFerme(nIDFichier)
SINON
Erreur()
FIN


mais mon TRACE renvoie toujours -1 donc ne trouve pas la position.
Qui peut m'aider pour débloquer cette situation ?
D'avance merci.
Cordialement
Miembro registrado
352 mensajes
Publicado el 05,diciembre 2019 - 09:33
Bonjour.
Vous n'adoptez pas la bonne méthode pour l'extraction des données, l'astuce, c'est de dire qu'un fichier HTML se traite exactement de la même manière qu'un fichier XML.
Pour cela, faites appel à la fonction XMLExtraitChaîne
Documentation de la fonction : https://doc.pcsoft.fr/fr-FR/?3081017&name=xmlextraitchaine_fonction
Miembro registrado
24 mensajes
Publicado el 05,diciembre 2019 - 13:27
Bonjour,

Peut-être la fonction
HTMLVersTexte()
Miembro registrado
2.682 mensajes
Publicado el 05,diciembre 2019 - 15:43
ROMULUS001 a écrit :
Bonjour.
Vous n'adoptez pas la bonne méthode pour l'extraction des données, l'astuce, c'est de dire qu'un fichier HTML se traite exactement de la même manière qu'un fichier XML.
Pour cela, faites appel à la fonction XMLExtraitChaîne
Documentation de la fonction : https://doc.pcsoft.fr/fr-FR/?3081017&name=xmlextraitchaine_fonction


Attention tout de même, le HTML est très permissif et même s'il s'apparente à du xml, régulièrement on rencontre des balises qui ne sont pas fermées. Dans ce cas là le xml est considéré comme incorrect et on ne peut pas le parcourir.

Il n'existe toujours pas de parseur HTML sur Windev, ce qui est bien dommage.

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
352 mensajes
Publicado el 05,diciembre 2019 - 17:15
Philippe SB a écrit :

> Attention tout de même, le HTML est très permissif et même s'il s'apparente à du xml, régulièrement on rencontre des balises qui ne sont pas fermées. Dans ce cas là le xml est considéré comme incorrect et on ne peut pas le parcourir.

Ceci est un faux problème, si un fichier est corrompu ou syntaxiquement incorrect, il est très compliqué de pouvoir travailler dessus, mais du contenu HTML comme présenté dans le 1er post ne causera aucun problème
Miembro registrado
2.682 mensajes
Publicado el 06,diciembre 2019 - 14:36
Ceci est un faux problème, si un fichier est corrompu ou syntaxiquement incorrect, il est très compliqué de pouvoir travailler dessus, mais du contenu HTML comme présenté dans le 1er post ne causera aucun problème


C'est justement tout le cœur du problème. Je doute que le html qui va être récupéré ne contienne que ça. Je parle en connaissance de cause pour m'y être cassé les dents plus d'une fois.

Après ce n'est qu'une remarque et c'est en essayant qu'il verra si son html est compatible xml ou non.

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
112 mensajes
Publicado el 06,diciembre 2019 - 15:51
Bonjour et merci de vous interresser à mon problème.
Si je comprends bien, je dois mattre dans mon code quelque chose du type
// Chargement du code XML
SourceXML est une chaîne = fChargeTexte("MonDossier.html")
Résultat est une chaîne


Suis je sur la bonne piste ?
Mensaje modificado, 06,diciembre 2019 - 15:53
Miembro registrado
112 mensajes
Publicado el 06,diciembre 2019 - 15:54
suite du code car il plante le forum :





suis je sur la bonne voie ?

Merci de votre aide à tous.
Mensaje modificado, 06,diciembre 2019 - 15:55
Miembro registrado
2.682 mensajes
Publicado el 06,diciembre 2019 - 15:58
// Chargement du code XML
sMaChaineHTML est une chaîne = fChargeTexte("MonDossier.html")
SourceXML est un xmlDocument = XMLOuvre(sMaChaineHTML,depuisChaîne)

// A partir de là tu peux parcourir ton xml s'il est OK


--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
112 mensajes
Publicado el 06,diciembre 2019 - 16:05
OK merci pour la remise sur le bon chemin.
Je vais continuer mes tests.
Bonne fin de journée.
Miembro registrado
13 mensajes
Publicado el 06,diciembre 2019 - 16:28
Bonjour,

Nous avons réalisé un composant nommé wQuery qui vous permet d'extraire ceux que vous souhaitez dans le code HTML de la même façon que jQuery (même syntaxe).

Ce composant permet de faire gagner énormément d'heure, il réalise un parsing du code, et vous mets à disposition une syntaxe très souple pour récupérer les éléments que vous souhaitez (innerTest, outerText, attribut, etc...).

Nous le commercialisons pour une exploitation libre.

N'hésitez pas à nous contacter si vous souhaitez en savoir plus.

Cordialement,

--
CEO MindSoft
Expert WinDev / WebDev / WinDev Mobile
Miembro registrado
962 mensajes
Publicado el 07,diciembre 2019 - 10:29
hello,
Philippe SB a écrit :
> Il n'existe toujours pas de parseur HTML sur Windev, ce qui est bien dommage.

et les requêtes XPATH alors ?
exemple :

// J.P Décembre 2019
MaCHaineHTML est une chaîne = [
<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=iso8859-1" />
<style>
.libelle { background-color: black; color: white; }
</style> </head>
<body>
<h1>Mon Test HTML</h1>
<table id="matable">
<tr><th class="libelle">Civilité :</th><td>Mme</td></tr>
<tr><th class="libelle">Prénom :</th><td>MARIE</td></tr>
<tr><th class="libelle">Nom</th><td>ANTOINETTE</td></tr>
<table>
</body>
</html>
]
res est un booléen = XMLDocument("maRecherche",MaCHaineHTML,xHTML)
SI ErreurDétectée ALORS
Erreur("le fichier n'est pas au bon format ")
RETOUR
FIN
// RequeteXPATH : on sélectionne le td de la table 1 dont le tr a un th fils qui à pour valeur "Civilité :"
RequeteXPATH est une chaîne = "/html/body/table[1]/tr[th='Civilité :']/td"
AfficherValeurs("maRecherche",RequeteXPATH)
// RequeteXPATH : on sélectionne tous les td de la table dont l'id = "matable"
RequeteXPATH = "//*[@id=""matable""]/tr/td"
AfficherValeurs("maRecherche",RequeteXPATH)


avec la procédure AfficherValeurs :
Procedure AfficherValeurs(doc,xpath)
b est un booléen = XMLExecuteXPath (doc, xpath)
// Est-ce une requête de calcul ?
SI b=Vrai ET XMLEnDehors(doc)=Vrai ALORS
// voilà le résultat du calcul
Trace("XMLRésultat="+XMLRésultat(doc))
FIN
// Est-ce une requête XPath de sélection ?
SI XMLTrouve(doc)=Vrai ALORS
x est un entier = 1
// Parcours de la sélection résultat
TANTQUE XMLTrouve(doc)=Vrai
Trace(x," : ",XMLDonnée(doc))
x++
XMLSuivant(doc)
FIN
// Parcours terminé, on termine la requête
XMLAnnuleRecherche(doc)
FIN
Trace("==============================")


Résultat :





--
Ami calmant, J.P
Mensaje modificado, 07,diciembre 2019 - 10:36
Miembro registrado
352 mensajes
Publicado el 09,diciembre 2019 - 10:59
Pour les requêtes XPATH, il existe la fonction XMLExécuteXPath
https://doc.pcsoft.fr/fr-FR/?3081015&name=xmlexecutexpath_fonction
Miembro registrado
2.682 mensajes
Publicado el 09,diciembre 2019 - 12:20
et les requêtes XPATH alors ?

Je persiste et signe en disant que comme HTML est très permissif, le xml peut ne pas être correct et dans ce cas, les requêtes xpath ne fonctionneront pas non plus.

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
352 mensajes
Publicado el 09,diciembre 2019 - 14:05
> Je persiste et signe en disant que comme HTML est très permissif, le xml peut ne pas être correct et dans ce cas, les requêtes xpath ne fonctionneront pas non plus.

Et si le html serait en fait du xhtml?
Miembro registrado
2.682 mensajes
Publicado el 09,diciembre 2019 - 14:28
Et bien je vous laisse vous casser les dents, j'en ai déjà fait les frais plus d'une fois, mais rien ne vaut l'expérience personnelle.

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
352 mensajes
Publicado el 10,diciembre 2019 - 14:09
le xhml est du hml qui est correct au niveau xml, donc on revient à un cas facile à considérer
Miembro registrado
112 mensajes
Publicado el 10,diciembre 2019 - 15:53
Bonjour,
Je suis pris sur d'autres sujets mais je fais les tests au plus vite pour vous tenir informé....
Miembro registrado
962 mensajes
Publicado el 21,diciembre 2019 - 17:15
hello,
ROMULUS001 a écrit :
Pour les requêtes XPATH, il existe la fonction XMLExécuteXPath
https://doc.pcsoft.fr/fr-FR/?3081015&name=xmlexecutexpath_fonction


Avec ma version jurassique de windev (16) cette fonction n'existait pas.
=============================
Philippe SB a écrit :
et les requêtes XPATH alors ?

Je persiste et signe en disant que comme HTML est très permissif, le xml peut ne pas être correct et dans ce cas, les requêtes xpath ne fonctionneront pas non plus.

Dans le cas d'un HTML très permissif on peut utiliser l'assemblage dotnet HtmlAgilityPack. Voici le code pour l'équivalent de mon code qui se trouve au-dessus.
// même chose en utilisant la bibliothèque dotnet HtmlAgilityPack (compatible HTML et XHTML)
docHTML est un HtmlAgilityPack.HtmlDocument()
docHTML.LoadHtml(MaCHaineHTML)
noeudsHTML est un HtmlNodeCollection dynamique
noeudHTML est un HtmlNode dynamique
noeudsHTML = docHTML.DocumentNode.SelectNodes("/html/body/table[1]/tr[th='Civilité :']/td")
POUR TOUT noeudHTML de noeudsHTML
Trace(noeudHTML.get_InnerText())
FIN
Trace("=============")
noeudsHTML = docHTML.DocumentNode.SelectNodes("//*[@id=""matable""]/tr/td")
POUR TOUT noeudHTML de noeudsHTML
Trace(noeudHTML.get_InnerText())
FIN


--
Ami calmant, J.P