Le code VBA qui suit vous permet d'obtenir le code source HTML complet d'une page web. Il s'agit d'un excellent outil pour l'extraction des données d'une page internet car vous obtenez, en quelques secondes, sous forme de chaîne de caractères ( String
) tout le contenu de la page spécifiée.
Vous pouvez ensuite travailler avec cette chaîne pour en récupérer exactement le contenu que vous souhaitez. C'est une méthode idéale pour celui qui veut extraire des données à partir de l'internet de manière massive ou régulière.
Comme on ne télécharge que le code source en HTML (= du simple texte; les images, les fichiers JavaScript etc. ne doivent pas être téléchargés), la fonction est extrêmement rapide et vous permets d'obtenir le contenu (= "scraper") de centaines de pages en quelques minutes, voir secondes.
Le code de la fonction VBA qui extrait le contenu d'une page web
La fonction utilise comme paramètre le lien URL de la page web. L'utilisation ou non de la barre oblique ("/") à la fin du lien ne modifie pas la fonctionnalité. Si la page web est inaccessible ou n'existe pas, le résultat de la fonction est l'erreur #N/A
( xlErrNA
).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Public Function ExtraireSourceHTML(LienURL As String) 'par: Excel-Malin.com ( https://excel-malin.com ) On Error GoTo ExtraireSourceHTMLErreur With CreateObject("MSXML2.XMLHTTP") .Open "GET", LienURL, False .Send If .ReadyState = 4 Then If .Status <> 200 Then ExtraireSourceHTML = CVErr(xlErrNA) Else ExtraireSourceHTML = .ResponseText End If Else ExtraireSourceHTML = CVErr(xlErrNA) End If End With Exit Function ExtraireSourceHTMLErreur: ExtraireSourceHTML = CVErr(xlErrNA) End Function |
Exemple d'utilisation de l'extraction de code HTML
Pour illustrer l'utilisation de la fonction ExtraireSourceHTML()
, on peut créer une petite procédure en VBA qui va extraire le code source HTML de la page d'accueil du site Wikipedia.org (https://fr.wikipedia.org). Comme résultat, un message (MsgBox
) est affiché avec les premiers 350 caractères du code…
Notez que pour que le code suivant fonctionne, vous avez besoin d'ajouter dans votre Module également le code de la fonction principale – vous devez donc avoir dans votre projet deux codes VBA – la fonction même et la procédure qui suit.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub ExempleExtractionHTML() 'par: Excel-Malin.com ( https://excel-malin.com ) On Error GoTo ExempleErreur Dim MonLienURL As String MonLienURL = "https://fr.wikipedia.org" '<-- placez ici votre lien CodeHTML = ExtraireSourceHTML(MonLienURL) 'votre code pour traiter les données obtenues MsgBox "Apperçu du code HTML de " & MonLienURL & ":" & Chr(13) & Chr(10) & Chr(13) & Chr(10) & _ Left(CodeHTML, 350) '= exemple: affiche un message avec les premiers 350 caractères du code HTML Exit Sub ExempleErreur: MsgBox "Une erreur est survenue..." End Sub |
Maintenant, il vous suffit de changer dans le code l'adresse URL de Wikipédia par celui que vous souhaitez et le tour est joué!
Ajoutez tout cela dans une boucle et l'Internet ne pourra plus vous résister.
Automatiser l'extraction des codes HTML avec VBA
Si vous souhaitez de créer un "webscraper" pour extraire le code HTML des pages internet de manière régulière (et en récupérer une information particulière), vous pouvez éventuellement créer un fichier "batch" pour automatiser toute votre procédure… Et le code VBA pour extraire une partie spécifique du texte pourrait également vous être utile pour extraire exactement l'information dont vous avez besoin à partir du code HTML de la page…
Pour aller plus loin en Excel et en VBA
Voici d'autres cas d'utilisation de VBA en lien avec Internet:
- Avec VBA, vous pouvez également télécharger un fichier à partir d'internet. Vous venez d'apprendre à récupérer le code de la page (qui contient les adresses des images, vidéos et autre contenu) – il reste à récupérer le contenu média. Vous aurez ainsi un puissant outil de récupération du contenu en ligne!
- Vous voulez facilement créer des listes HTML à partir de vos données dans Excel?
Et pour finir, encore quelques articles qui pourraient vous être utiles…
- Liste de toutes les fonctions disponibles en VBA
- Manipulation des fichiers avec VBA
- Utiliser la formule Excel RECHERCHEV dans vos macros VBA
- Calculer la SOMME en VBA
15 commentaires sur “VBA: Obtenir code source HTML d’une page web”
Bonjour,
merci pour ce code vraiment utile, par contre pourriez vous me dire comment faire pour mettre coller le code source de la page web dans une feuille excel, donc dans a1, a2, a3 etc… plutot que dans un msgbox ?
Je suis pas trés forte sous excel 🙂
Bonsoir,
Je souhaite extraire le code html d'une page, plus précisément d'un jeu par navigateur afin de faire des simulation de calculs sur Excel.
Cependant et malgré le fait que le site internet est bien accessible, J'ai un retour d'erreur 2042 et je ne sais pas trop pourquoi .
Auriez vous une idée ?
Pour info, C'est un site en java avec une connexion au démarrage (login et mdp)
En vous remerciant par avance.
Cordialement,
Jeremy
Bonjour,
Une petite relance dans le cas où mon message serait passe inapercu.
Cdt
Bonjour Jeremy,
désolé pour la réponse tardive mais je suis actuellement très pris…
Dans votre cas, le problème vient probablement du fait que la page est généré par java.
En fait, pour que mon code fonctionne, il faut que le contenu du site se trouve dans le code source HTML/PHP de la page. Si le contenu de la page est seulement un appel d'un applet Java qui après gère tout "à distance", le contenu ne sera pas exploitable de cette manière.
Vous pouvez faire le test vous même: une fois la page chargé, ouvrez son code source (clic droit + "afficher la source") et essayez de retrouver l'info qui vous intéresse dans le contenu du code source.
Bien à vous,
Martin
Bonjour,
Aucun problème, mais oubliant parfois des message moi même je me dis que ça peut arriver aux autres^^
Après avoir fais le test je trouve bien les infos nécessaire sur les différentes pages html.
Je me demande si ce n'est pas lié a mon explorateur internet, l'extraction html par excel est elle lié a IE ?
Cordialement,
Jérémy
Bonjour,
Désolé je n'ai pas trouvé comment éditer le précédent message.
comparativement a une autre feuille excel ou cela fonctionne, c'est cette ligne qui fait ressortir l'erreur.
If .Status 200 Then
Du coup cela me renvoi l'erreur a la ligne suivante.
ExtraireSourceHTML = CVErr(xlErrNA)
En espérant que l'on puisse avancer.
Cordialement,
Jérémy
Bonjour,
Oui c'est encore moi, désolé d'insister mais malgré tous mes "efforts" et tests je n'arrive toujours pas à extraire le code html que je désire, c'est peut être tous simplement impossible.
Pourtant je vois bien les info nécessaire dans la source de ma page cependant, peut-etre que cela viens du serveur qui bloque une commande nous permettant d'extraire cette source.
je reste ouvert a toute proposition et vous remercie encore.
Cordialement,
Jeremy
Bonjour Jeremy, désolé pour la réponse tardive mais pour le moment, je suis très sollicité et c'est difficile de suivre…
Ce que vous pouvez faire, c'est m'envoyer l'adresse de la page sur mon email contact@excel-malin.com pour que je puisse tourner le code et voir directement ce qui cloche.
Je ne promets rien mais je vais regarder et voir si je peux vous aider.
Bien à vous, Martin
Le code :
Exit Function
Apparait comme non valide sous Excel 365/2019.
<span semble poser probléme
Bonjour, merci pour la remarque!
C'était un problème de formatage du code ici sur la page. La ligne ne devait contenir que "Exit Function".
J'ai corrigé le code.
Cordialement, Martin
Bonjour,
Je ne suis pas un pro d'excel mais je bidouille un peu ^^. J'ai cherché pendant des jours et des jours comment faire par moi meme pour télécharger un code source avec une variable en guise d'url … sans succès … et je suis tombé sur cette pépitte !!!
tout fonctionne TRES BIEN
sauf que le code source va se retrouver dans une seule cellule ….
pour corrigé ce soucis voila la solution que j'ai mise en place
1) je change le on error goto en on error resume next
2) je supprime le message box de l'appercu du code source + le exitsub + l'arrivé du goto
3) je fais ça =>
MonLienURL = "https://excel-malin.com/codes-sources-vba/obtenir-code-source-html-page-web/" '<– placez ici votre lien
codehtml = ExtraireSourceHTML(MonLienURL)
Range("a1") = codehtml
i = 1
'tant qu'il y a des saut de lignes dans le code source
Do While InStr(codehtml, Chr(10)) 0
'si le 1re caractere est un saut de ligne ; ça le supprime
If InStr(codehtml, Chr(10)) = 1 Then
codehtml = Right(codehtml, Len(codehtml) – 1)
End If
'ecrit dans a&i la gauche du code source jusqu'au saut de ligne
Range("A" & i) = Left(codehtml, InStr(codehtml, Chr(10)) – 1)
'ici c'est un checkbox que j'ai mis sur mon userform pour faire ou non ces modif
If www_car_spe = True Then
'remplace les " " (html) par des " " (pour éviter d'écentuelles erreurs)
Range("A" & i) = Replace(Range("A" & i), " ", " ")
Range("A" & i) = Replace(Range("A" & i), "<", "")
Range("A" & i) = Replace(Range("A" & i), "&", "&")
Range("A" & i) = Replace(Range("A" & i), """, Chr(34))
End If
'retravaille le code source ; code source = droite du code source sur le nbr de car du code source – le N° de car du saut de page)
'a supprime ce que j'ai ecris sur A&i
codehtml = Right(codehtml, Len(codehtml) – InStr(codehtml, Chr(10)) + 1)
'saut de ligne
i = i + 1
Loop
'a vous de traité le code source ligna par ligne comme vous avez besoin ^^
Je sais que ma soluc n'est pas forcément la plus élégente; elle n'est peu etre pas parfaite … mais si ça peu aider …. cadeau 🙂
MERCI excel_Malin
Bonjour,
Merci pour ce code très utile.
J'ai un soucis, le résultat n'est pas constant.
Cela fonctionne correctement mais régulièrement, il ne charge que les 7 000 premiers caractères, environ, sur des pages https qui en font plutôt 300 000.
La même page peut être chargée correctement plusieurs fois d'affilé comme elle peut ne pas être chargée correctement plusieurs fois d'affilé.
Avez-vous une explication ?
Avez-vous un correctif possible ?
Merci de votre aide.
Bravo, j'aime bien l'article !
Bonjour,
J'ai essayé ton code avec "https://fr.wikipedia.org" et j'ai un code retour
sur l'instruction send, : Err.Description=Erreur système : -2146697208 Err.LastDLLError = 6
Si tu as une idée
NB : j'ai essayé en natif avec les API InternetOpen et InternetOpenUrl, et c'est pas mieux (Err.LastDLLError =12157). C'est pareil avec d'autres sites, mais d'autres marchent, RadioFrance. Je galère, là …
Bien à toi
Bonjour,
je viens de le tester chez moi et cela fonctionne:
L'erreur que tu mentionnes est une erreur de Windows, donc il faudrait chercher du côté de Windows, pas de Office.
J'ai googlé l'erreur "12157" et il semblerait que ce soit une erreur de la sécurité de connexion.
Essaie peut-être sur un autre ordinateur pour en avoir le cœur net.
Bien à toi, Martin