Parser du HTML en VBA

Hi,

Je cherche à récupérer des infos de divers sites web dans un fichier.

Voici deux des pages qui m’intéressent :

view-source:http://www.wcgsig.com/projects.html

view-source:https://sech.me/boinc/Amicable/server_status.php

L'idée c'est de récupérer les projets qui ne sont pas à 100%, leur pourcentage d'avancement et le temps restant estimé pour les finir.

Dans le premier lien, les infos sont du type :

    <TR>
        <TD><IMG src="http://www.worldcommunitygrid.org/images/pb/scc1_2.jpg" width="18" height="18"> <A href="http://www.worldcommunitygrid.org/research/scc1/overview.do">Smash Childhood Cancer</A></TD>
        <TD class="bar" style="background-size:8px 16px">8.0%</TD>
        <TD class="bar" style="background-size:46px 16px">46%</TD>
        <TD>2020/03/20</TD>
        <TD class="right">788</TD>
    </TR>

Comprendre que le sous-projet Small Chilhood Cancer a un poids de 8% dans l'ensemble du projet, qu'il est fini à 46% et qu'on estime qu'il sera bouclé le 20/03/2020.

Dans le second lien, la partie qui nous intéresse est la suivante :

      <table  width="100%" class="table table-condensed table-striped" >
    <tr><td>Tasks ready to send</td><td>1818</td></tr>
<tr><td>Tâches en cours</td><td>20987</td></tr>
<tr><td>Workunits waiting for validation</td><td>1</td></tr>
<tr><td>Workunits waiting for assimilation</td><td>0</td></tr>
<tr><td>Workunits waiting for file deletion</td><td>0</td></tr>
<tr><td>Tasks waiting for file deletion</td><td>0</td></tr>
<tr><td>Transitioner backlog (hours)</td><td>0.00</td></tr>
<tr><td>Current progress (search up to 10<sup>20</sup>)</td><td>18.5660%</td></tr>
<tr><td>ETA at current speed (search up to 10<sup>20</sup>)</td><td>Jan 2019</td></tr>
</table>

Le projet est avancé à 18,56% et devrait se terminer en janvier 2019.

J'imagine qu'il faut utiliser du vbtextCompare et naviguer entre les lignes de code html, mais je nage un peu malgré la lecture d'un tuto ( https://stackoverflow.com/questions/23303551/parse-html-in-vba-to-extract-information-from-description-list )

L'idée serait de balancer ça dans un csv par la suite.

Bonjour Kit,

Si tu lis l'anglais, cette page explicative peut t'être utile également:

https://codingislove.com/parse-html-in-excel-vba/

Bonsoir,

Un tel résultat te serait-il utile?

Cdlt.

186pq-kit.xlsx (25.39 Ko)

@GVIALLES : Merci, je vais y jeter un œil.

@Jean-Eric : Je vois que tu utilises des Requêtes. Pour la première, il y a un soucis lors de la MaJ :

Expression.Error : L'importation Percentage.Type ne correspond à aucune exportation. Avez-vous oublié une référence de module ?

J'ai pas d'expérience dans les requêtes, je vais voir pour trouver un tuto.

Merci.

Bonjour,

J'ai ré ouvert le fichier et fais les mises à jour.

Aucun souci...

Pour des explications, me dire. Sinon, voir "Transformer et récupérer" (Power Query) sur le Web.

Je n'ai pas fait de mise en forme particulière; mais on peut le faire comme dans une feuille de calcul...

Cdlt.

Bonjour à tous

j'avais zappé ce sujet !

voici un exemple de récupération de <table> via un copier dans le presse papier et ensuite un coller

pour le second tu peux utiliser ceci

et pour le premier, ceci

Bonjour,

J'ai ré ouvert le fichier et fais les mises à jour.

Aucun souci...

Pour des explications, me dire. Sinon, voir "Transformer et récupérer" (Power Query) sur le Web.

Je n'ai pas fait de mise en forme particulière; mais on peut le faire comme dans une feuille de calcul...

Cdlt.

Merci Jean-Eric pour cette version, je n'ai jamais expérimenté cette façon d efaire, je vais creuser ...

Re,

@ Steelson,

Ta version Excel suppose que tu télécharges le complément gratuit Power Query pour Excel 2013.

https://www.microsoft.com/fr-FR/download/details.aspx?id=39379

Bon apprentissage.

Cdlt.

Bonjour à tous,

Pour récupérer un tableau html, il suffit de pointer sur les balises <tr> et <td>

Ci-joint un exemple pour une récup "brute de décoffrage" des tableaux des 2 sites en question

(site www.wcgsig.com sur Feuil1, site sech.me sur Feuil2)

Pierre

248kit.xlsm (31.83 Ko)

Merci, c'est en effet une façon plus intéressante que cella que je pratiquais ...

Salut,

Je suis en train de décortiquer le code de pierrep56, c'est clairement au dessus de ce que j'ai l'habitude de faire, ne serait-ce que parce que je n'ai pas le reflexe d'utiliser des fonction ou d'appeler des Sub avec des variables.. Du coup c'est intéressant !

J'obtiens une erreur sur la ligne 56 (.send dans la fonction HTML => "Impossible d'établir une connexion avec le serveur").

Le site s'affiche bien sur mon navigateur internet. Problème de proxy ? J'essaierai depuis un autre endroit sans proxy !

Autre question : quelle est la raison de cette ligne dans la sub Lire =>

lig = 1
    ReDim T(1 To 10, 1 To lig)

Pourquoi ne pas mettre directement Dim T(1 to 10, 1) au moment de déclarer les variables ?

Bonjour,

* Pour l'erreur '.send' => je ne sais pas (proxy, peut être, c'est possible?).

* Pour la variable T :

-- cette variable va servir à stocker des info dont on ne connait pas à priori le volume. On la déclare au début avec un 'Dim T as variant' qui en fait n'est pas obligatoire puisque l'instruction ReDim suffit en Vba.

Mais c'est une question d'habitude : pour 'faire propre' la règle est de déclarer toutes les variables avant les lignes de codes (sans que ça soit une obligation strictement fonctionnelle en Vba, qui est un langage assez permissif pour sa syntaxe, contrairement à d'autres. Pour rappel le B de VBa c'est 'Basic' ...)

Dernier point : le type 'Variant' est un type 'fourre-tout' en Vba.

-- on va donc dimensionner T au fur et à mesure de la lecture des données du site => Redim Preserve ...

A noter : ici le 10 de 'T(1 to 10 ...' est empirique.

-- La particularité des variables tableaux en Vba est qu'on ne peut redimensionner uniquement que la 2ème dimension. On va donc remplir le tableau en le 'couchant' (les colonnes en lignes, les lignes en colonnes), puis à la fin du traitement on le remet droit (lignes en lignes, colonnes en colonnes) avec la fonction 'Transpose'.

-- Mais pourquoi réécrire la fonction 'Transpose' alors qu'elle est déjà disponible sous Vba (Application.Transpose) ? => parce que cette 'Application.Transpose' est limitée, Microsoft a oublié de la réécrire proprement quand les feuilles ont eu plus de 65536 lignes.

* Pour les Function et les Sub à argument(s) => une 'bonne pratique' en programmation est de scinder son code en plusieurs entités, chacune effectuant une tâche (ou un petit nb de tâches). De cette façon :

-- le code gagne en lisibilité,

-- pour les gros projets, c'est plus facile à modifier et à débuguer (et on regroupe les Sub et Function dans des modules distincts par 'familles'),

-- et certaines tâches peuvent être réutilisées telles quelles soit dans la même appli (ici la 'sub Lire' sert 2 fois), soit pour d'autres besoins ailleurs. Ainsi mes Function HTML et Transpose viennent de ma 'bibliothèque' de codes que je réutilise selon mes appli.

-- on gagne donc en temps de développement car ça évite de réinventer la roue à chaque fois (juste un copier/coller)

Effectivement chez moi ça marche, ça doit être le proxy de là où je postais tout à l'heure qui pose problème.

Pour le Redim, la question était plutôt : Pourquoi ne pas supprimer cette ligne (ce Redim là, pas celui dans la boucle) en définissant directement la taille du tableau au moment de déclarer la variable en début de sub ?

En attendant je vais jouer un peu avec ton code pour éviter d'avoir certaines lignes qui apparaissent, etc...

Merci !

Un Redim ne fait pas la même chose qu' un Redim preserve!

Tu peux tester en effaçant le Preserve pour t'en convaincre.

Rechercher des sujets similaires à "parser html vba"