Récupérer Tableau Page Web
Bonjour à tous,
Cela fait un moment que je cherche à récupérer les données de deux tableaux (le classement de la presse et les pronostics de la presse) présents sur une page web via power query. J'ai déjà réalisé la connexion dans le fichier joint.
N'y arrivant pas, je fais appel à la communauté pour obtenir une réponse.
Je souhaiterais vraiment y arriver avec power query dans la mesure du possible.
S'il s'avère que ce n'est pas possible, pourriez-vous m'indiquer une façon d'y arriver avec le VBA ?
Merci d'avance de votre aide,
Olivia
Bonjour à tous,
N'y-a-t-il personne que cela inspire ?
Voici le lien de la page en question :
http[://www.]statoprono[point]com/F_classementpressepub[point]php?nocall=1&deltacall=-1
D'avance merci d'un petit coup de main.
Bonne journée,
Olivia
Voici
Un grand merci Steelson.
Effectivement il fallait bien saisir une date car l'adresse brute que j'avais indiquée n'affichait rien.
Ta réponse m'oblige à me pencher un peu plus en profondeur sur la récupération de données via du VBA.
Peux-tu m'indiquer où je pourrai trouver un peu plus d'informations sur l'objet DataObject et ses propriétés et méthodes ? J'aimerais pouvoir reproduire cette démarche sur d'autres sites.
Encore merci et bon dimanche,
NB : si quelqu'un a la démarche en power query, je reste preneuse.
Hum ... sur le net, et au travers d'exemples ici.Ta réponse m'oblige à me pencher un peu plus en profondeur sur la récupération de données via du VBA.
Peux-tu m'indiquer où je pourrai trouver un peu plus d'informations sur l'objet DataObject et ses propriétés et méthodes ?
Mais il y a plusieurs façons de trouver les informations, et toutes ne sont pas interchangeables.
Je vais faire un topo en récupérant les différents cas que j'ai pu traiter !
Excellent
Steelson, vraiment merci d'avance pour le topo et pour le temps que tu consacres à cela.
C'est une super idée qui en aidera plus d'un je pense .
Début du tuto ... par épisodes. Une fois terminé et surtout compréhensible, je le mettrai dans une rubrique adaptée.
J'avais déjà tenté un rédaction ici https://forum.excel-pratique.com/viewtopic.php?p=702547#p702547 sans être satisfait à 100%.
COMMENT RÉCUPÉRER DES INFORMATIONS DU WEB ?
D'abord, attention aux copyrights !
Premier réflexe : utiliser PowerQuery qui se chargera de proposer les tableaux de la page web en question.
Autre solution ... elle se trouve ici : https://www.excel-pratique.com/fr/telechargements/macros/tables-html-site-excel-no432.php
Pour comprendre cette solution, il faut se rappeler qu'une page web, c'est du texte qu'un navigateur va interpréter et assembler avec d'autres ressources (images, scripts, styles).
On peut aller chercher la source par une simple interrogation
Sub Maj()
Dim URL$, obj As New DataObject
DoEvents
URL = Cells(1, 1).Value
On Error Resume Next
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", URL, False
.Send
If .Status = 200 Then
txt = .responseText
obj.SetText txt
obj.PutInClipboard
MsgBox "ouvrir traitement de texte (genre wordpad ou notepad++ sinon le bloc notes) et faire Ctrl+V"
End If
End With
End Sub
Ce texte assez libre a néanmoins a un format codifié à base de balises :
<table________>_____________</table> pour un tableau
<a href="_____________">cliquer ici</a> pour un lien vers une autre page
<form method="___post___ou___get___"><input type="_______">____</form>
etc.
On peut en extraire les parties qui nous intéressent, sachant qu'excel a la particularité de bien interpréter les tableaux copiés en respectant leur mise en forme. La commande split permettra de sélectionner la partie du texte intéressante :
txt = "<table" & Split(Split(.responseText, "<table")(i), "</table>")(0) & "</table>"
Pourquoi cela ne marche pas à tous les coups !
1- D'abord il faut que le site soit structuré en tableaux (balise <table>
), ce qui n'est pas toujours le cas, certains sites privilégiant l'utilisant de balises "fourre-tout" ou génériques <div>
!
Parce qu'ensuite, certains sites comme celui-ci objet de ce sujet imbrique les tableaux dans des tableaux. On y reviendra dans les chapitres suivants avec des méthodes textuelles ou utilisant le DirectObjectModeling.
Ou enfin les données sont fournies dans une structure particulière en JavaScriptObjectNotation json qui requiert des méthodes spécifiques.
2- Mais aussi parce qu'il faut parfois indiquer des paramètres. Ceux-ci sont passés au travers de <form>
dont je parlais plus haut. Il y a 2 méthodes :
- méthode get : les paramètres sont en clair dans l'URL séparés par le caractère esperluette
&
. Voici une fonction simple qui permet alors de récupérer le texte-code source de la page web.
Function HtmlGet(URL As String) As String
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", URL, False
.Send
HtmlGet = .responseText
End With
End Function
- méthode post : les paramètres ne sont pas en clair dans l'URL, cela devient plus compliqué ! on mettra ces paramètres et leur valeurs dans une cellule en séparant les paramètres par
&
et en affectant leur valeur avec=
. Voici une fonction simple qui permet alors de récupérer le texte-code source de la page web.
Function HtmlPost(URL As String, param As String) As String
With CreateObject("MSXML2.XMLHTTP")
.Open "POST", URL, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.Send param
HtmlPost = .responseText
End With
End Function
3- autre écueil : les sites demandent une authentification explicite (utilisateur et mot de passe) ou implicite (session, token/jeton)... on verra cela aussi par la suite en simulant un navigateur !
4- enfin, la page peut se compléter après chargement (fonctionnement asynchrone ajax) ... cela peut aboutir à des impossibilités.
On reviendra sur les points 1, 2, 3 et 4 ci-après ...
Excellentissime !!!
Ton topo est vraiment très intéressant.
Je n'ai pas encore tout digéré mais j'ai déjà beaucoup appris.
Je suis très intéressée par la suite
Merci beaucoup Steelson pour le temps passé à rédiger cela.
Juste une petite question par rapport à ma demande initiale.
J'ai constaté que dans les données récupérées dans les tableaux de la page web, les accents sont transformés en symboles.
Y-a-t-il moyen d'y remédier ?
Merci d'avance.
Olivia
Le site est mal codé, il ne précise pas utf-8 et n'emploie pas l codage des caractères diacritiques :J'ai constaté que dans les données récupérées dans les tableaux de la page web, les accents sont transformés en symboles.
Y-a-t-il moyen d'y remédier ?
é
s'écrit é
Cela concerne uniquement Tiercé-mag ... je vais regarder. C'est compliqué car c'est remplacé par un pseudo point d’interrogation, dont le code ascii est le même que ?
pour excel ! et ?
veut dire "tous les caractères" donc tout est alors remplacé par ?
.
... suite ...
Comment récupérer des données quand PowerQuery ou la moulinette https://www.excel-pratique.com/fr/telechargements/macros/tables-html-site-excel-no432.php ne fonctionne pas !
Considérons que l'appel au site est réglé, que ce soit directement avec une URL, que ce soit avec des paramètres transmis en méthode get (nota : dans ce cas, ne pas oublier d'encoder les paramètres par WorksheetFunction.EncodeUrl) ou post expliquée au point 2 ici https://forum.excel-pratique.com/viewtopic.php?p=838402#p838402.
Il faut pouvoir a minima repérer les données dans le code source de la page (affichage par un clic droit + afficher la source ou Ctrl+u pour ce qui est de chrome par exemple).
2 grandes options :
Les 2 options sont quasi équivalentes. La première est plus "professionnelle". Dans le cas des tableaux objet du post initial, il a fallu passer par la manipulation du texte du code source pour arriver à "piéger" le tableau de valeurs.
1- manipuler les objets :
Il faut créer une page As New HTMLDocument
et charger dans cette page la réponse
page.body.innerHTML = pageHTML(url)
Ensuite, on utilisera getElementsByTagName pour la balise (tag) dans laquelle se trouve ce qui est recherché. Pour affiner la recherche, on pourra aussi discriminer selon un attribut de la balise via getAttribute afin de récupérer le contenu innerHTML
Exemple avec balise a
For Each lien In page.getElementsByTagName("a")
If lien.getAttribute("title") Like "Consulter les valeurs du secteur*" Then Range("A1") = lien.innerHTML
If lien.getAttribute("title") Like "*indice de référence*" Then Range("A2") = lien.innerHTML
Next
Exemple avec balise p
For Each paragraphe In page.getElementsByTagName("p")
If paragraphe.innerHTML Like "*MEUR*" Then Range("A3") = paragraphe.innerHTML
Next
Exemple avec balise table
For Each tableau In page.getElementsByTagName("table")
temp = "<table>" & tableau.innerHTML & "</table>"
Next
Au-delà de getElementsByTagName, on pourrait aussi utiliser getElementsByClassName ou getElementById
Une application consiste à lister tous les liens contenus dans un site (merci Pierre56) :
Sub liste()
Dim page As New HTMLDocument, lien As Object, lig As Integer, url As String, invit As String
[www].CurrentRegion.Offset(2, 0).ClearContents
page.body.innerHTML = pageHTML([www])
lig = 3
For Each lien In page.getElementsByTagName("a")
url = lien.getAttribute("HREF")
invit = lien.innerHTML
If url Like "*formation*" Then
Cells(lig, 1) = url
Cells(lig, 2) = invit
lig = lig + 1
End If
Next lien
End Sub
2- manipuler le code source comme étant du texte :
Dans ce cas, on cherchera dans le code source par quoi est encadré ce qui est recherché.
La page sera chargée dans une zone string
txt = pageHTML(url)
Et on utilisera la fonction split
txt = Split(Split(.responseText, avant)(i), apres)(0)
ou si on veut inclure les bornes de recherche
txt = avant & Split(Split(.responseText, avant)(i), apres)(0) & apres
parfois même répétée pour affiner comme dans l'exemple joint pour la valorisation.
Exemple comparé joint ...
Sub InterroViaTraitementDeTexte()
Dim url$, obj As New DataObject
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
url = [www]
txt = pageHTML(url)
' valeur isolées
Range("A1") = Split(Split(txt, "Consulter les valeurs du secteur ")(1), """")(0)
Range("A2") = Split(Split(txt, "Consulter l'indice de référence : ")(1), """")(0)
temp = Split(Split(txt, "valorisation")(1), "</li>")(0)
Range("A3") = Split(Split(temp, """>")(1), "<")(0)
' tables
For i = 1 To UBound(Split(txt, "<table"))
Range("A" & Rows.Count).End(xlUp).Offset(2, 0).Select
temp = "<table" & Split(Split(txt, "<table")(i), "</table>")(0) & "</table>"
obj.SetText temp
obj.PutInClipboard
Application.Wait Now + TimeValue("00:00:01")
ActiveSheet.Paste
Next
Range("A1").Select
End Sub
Sub InterroViaObjet()
Dim url$, page As New HTMLDocument, lien As Object, paragraphe As Object, tableau As Object
Dim obj As New DataObject
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
url = [www]
page.body.innerHTML = pageHTML(url)
For Each lien In page.getElementsByTagName("a")
If lien.getAttribute("title") Like "Consulter les valeurs du secteur*" Then Range("A1") = lien.innerHTML
If lien.getAttribute("title") Like "*indice de référence*" Then Range("A2") = lien.innerHTML
Next
For Each paragraphe In page.getElementsByTagName("p")
If paragraphe.innerHTML Like "*MEUR*" Then Range("A3") = paragraphe.innerHTML
Next
For Each tableau In page.getElementsByTagName("table")
Range("A" & Rows.Count).End(xlUp).Offset(2, 0).Select
temp = "<table>" & tableau.innerHTML & "</table>"
obj.SetText temp
obj.PutInClipboard
Application.Wait Now + TimeValue("00:00:01")
ActiveSheet.Paste
Next
Range("A1").Select
End Sub
NOTA : les sites évoluent en permanence, il faudra donc être capable de reprendre la macro pour l'adapter à l'évolution des sites.
Prochain chapitre : les données sont fournies dans une structure particulière en JavaScriptObjectNotation json
Dans le cas des tableaux objet du post initial, il a fallu passer par la manipulation du texte du code source pour arriver à "piéger" le tableau de valeurs.
J'ai réussi à piéger les tableaux souhaités en exploitant la propriété style.width
Sub viaObjet()
Dim page As New HTMLDocument, tableau As Object
Dim obj As New DataObject
'interro
Sheets("accueil").Select
page.body.innerHTML = HtmlPost([B1], [B4])
Sheets("via objet").Select
Cells.Clear
For Each tableau In page.getElementsByTagName("table")
If tableau.Style.Width = "340px" Or tableau.Style.Width = "500px" Then
Range("A" & Rows.Count).End(xlUp).Offset(3, 0).Select
temp = "<table>" & tableau.innerHTML & "</table>"
obj.SetText temp
obj.PutInClipboard
Application.Wait Now + TimeValue("00:00:01")
ActiveSheet.Paste
End If
Next
End Sub
Voici à titre d'exercice ...
Merci Steelson.
Je continue la lecture avec un grand intérêt.
J'apprends encore et encore
Bonne journée.
C'est pas fini !
Prochain chapitre : json ... exemple :
https://public.opendatasoft.com/api/records/1.0/search/?dataset=prix_des_carburants_j_7&q=52000
Rappel :
- les données sont sous forme de tableau : elles peuvent être accessibles via PowerQuery ou la moulinette https://www.excel-pratique.com/fr/telechargements/macros/tables-html-site-excel-no432.php
- les données sont "isolées" ou le tableau de données n'est pas accessible comme décrit ci-dessus : solution proposée avec getElementsByTagName, getElementsByClassName ou getElementById et sélection au moyen de leurs attributs par getAttribute . Il est toujours possible de traiter directement le texte-source au moyen de split.
Maintenant, voyons le cas où les données sont incluses dans le code source sous forme JSON. [quote="https://www.json.org/json-fr.html"]JSON (JavaScript Object Notation – Notation Objet issue de JavaScript) est un format léger d'échange de données.[/quote]
Exemples :
https://www.prevision-meteo.ch/services/json/geneve
https://public.opendatasoft.com/api/records/1.0/search/?dataset=prix_des_carburants_j_7&q=52000
On peut aussi lire la prose de maître Pierre56 https://forum.excel-pratique.com/viewtopic.php?p=838071#p838071
CAS SIMPLE : Prenons le cas de la météo de Genève ... quelle est la pression atmosphérique actuelle ?
- Lire le json au moyen d'un outil tel que firefox et repérer la donnée et son arborescence
- Créer par itération les objets ou "instancier" par set depuis le premier niveau jusqu'à l'avant dernier, ici un seul niveau :
Set Lobjet = VBA.CallByName(JsonObject, "current_condition", VbGet)
- Copier la donnée, en utilisant l'objet instancié précédemment, ici :
LAdonnee = VBA.CallByName(Lobjet, "pressure", VbGet)
Le code complet est donc :
Sub pression_actuelle()
Dim ScriptEngine As Object
Set ScriptEngine = CreateObject("ScriptControl")
ScriptEngine.Language = "JScript"
Dim JsonObject As Object, Lobjet As Object, LAdonnee As String
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.prevision-meteo.ch/services/json/geneve", False
.send
Set JsonObject = ScriptEngine.Eval("(" & .responsetext & ")")
End With
Set Lobjet = VBA.CallByName(JsonObject, "current_condition", VbGet)
LAdonnee = VBA.CallByName(Lobjet, "pressure", VbGet)
MsgBox "pression : " & LAdonnee
End Sub
on peut aussi écrire plus simplement et dans certains cas (quand le terme ne fait pas partie des mots réservés VBA)
MsgBox "pression : " & JsonObject.current_condition.pressure
CAS COMPLEXE : Prenons le cas des tarifs de carburants ... il y a ici 2 particularités, d'abord un nombre d’occurrences variables (différentes stations de service) et une des informations (horaires d'ouverture ou timetable) est elle-même sous forme json (que j'appellerai json gigogne) qu'il faudra traiter par itération.
- j'ajoute une fonction au ScriptControl :
Dim ScriptEngine As Object
Set ScriptEngine = CreateObject("ScriptControl")
ScriptEngine.Language = "JScript"
ScriptEngine.AddCode "function getProperty(jsonObj, propertyName) { return jsonObj[propertyName]; } "
qui permettra de lire les propriétés d'un objet, notamment sa longueur (length) qui sera le nombre d'occurrences dans le jargon javascript :
ScriptEngine.Run("getProperty", elem1, "length")
- j'instancie les objets pour atteindre les données souhaitées, objet1 puis objet2 qui est le sous-objet de objet1 et qui est ici l'indice du tableau, enfin objet3
On Error Resume Next ' absence d'un élément
Set objet1 = VBA.CallByName(JsonObject, "records", VbGet)
For n = 0 To ScriptEngine.Run("getProperty", objet1, "length") - 1
Set objet2 = VBA.CallByName(objet1, n, VbGet)
Set objet3 = VBA.CallByName(objet2, "fields", VbGet)
For i = 1 To 7
Range("B" & i).Offset(0, n).Value = VBA.CallByName(objet3, Range("A" & i).Value, VbGet)
Next
- pour la donnée-json timetable, captée -quand elle existe- par le biais de la même procédure, je la recompose en objet :
horaires = VBA.CallByName(objet3, "timetable", VbGet)
Set horairesObj = ScriptEngine.Eval("(" & horaires & ")")
Le code complet est donc :
Sub lire()
Dim ScriptEngine As Object
Set ScriptEngine = CreateObject("ScriptControl")
ScriptEngine.Language = "JScript"
ScriptEngine.AddCode "function getProperty(jsonObj, propertyName) { return jsonObj[propertyName]; } "
Dim JsonObject As Object, objet1 As Object, objet2 As Object, objet3 As Object, objet4 As Object
Dim horairesObj As Object
Sheets("lecture").Select
Range("A1").CurrentRegion.Offset(0, 1).ClearContents
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", [www], False
.send
Set JsonObject = ScriptEngine.Eval("(" & .responsetext & ")")
End With
On Error Resume Next ' absence d'un élément
Set objet1 = VBA.CallByName(JsonObject, "records", VbGet)
For n = 0 To ScriptEngine.Run("getProperty", objet1, "length") - 1
Set objet2 = VBA.CallByName(objet1, CStr(n), VbGet)
Set objet3 = VBA.CallByName(objet2, "fields", VbGet)
For i = 1 To 7
Range("B" & i).Offset(0, n).Value = VBA.CallByName(objet3, Range("A" & i).Value, VbGet)
Next
' traitement du json contenu dans timetable
horaires = ""
horaires = VBA.CallByName(objet3, "timetable", VbGet)
If horaires <> "" Then
Set horairesObj = ScriptEngine.Eval("(" & horaires & ")")
For i = 8 To 14
Set objet4 = VBA.CallByName(horairesObj, Range("A" & i).Value, VbGet)
Range("B" & i).Offset(0, n).Value = VBA.CallByName(objet4, "ouverture", VbGet) & " - " & VBA.CallByName(objet4, "fermeture", VbGet)
Next
Set horairesObj = Nothing
End If
Next
End Sub
CAS OU LE JSON EST CONTENU DANS UN SCRIPT DE LA PAGE :
Sa lecture via un outil comme firefox n'est pas possible. On peut utiliser cet outil et captant le json par le biais d'un traitement du texte-source de la page, exemple :
https://www.seloger.com/prix-de-l-immo/vente/provence-alpes-cote-d-azur/alpes-maritimes/nice/60088.htm
depuis = "data: "
jusque = "poisRue"":null}"
JsonString = Split(Split(.responsetext, depuis)(1), jusque)(0) & jusque
Set JsonObject = ScriptEngine.Eval("(" + CStr(JsonString) + ")")
Dans le cas présent, les données étaient aussi accessibles via des tables :
C'est toujours aussi passionnant.
C'est plus qu'un topo ! C'est un tuto très pédagogique
Je suppose qu'il y a encore d'autres épisodes à venir.
Je les attends avec impatience même si tout n'est pas encore intégré.
Grand merci Steelson !
Je suppose qu'il y a encore d'autres épisodes à venir.
oui ... pour le moment je me suis mis à développer le chapitre json en aparté https://forum.excel-pratique.com/viewtopic.php?p=840029#p840029
Bonjour,
Pour clore le chapitre json ... une autre façon d'accéder à la donnée est d'écrire :
objet.sousobjet.soussousobjet.donnee
par exemple
data.records.0.fields
Toutefois,
- certains mots sont réservés par excel et la casse en est modifiée comme fields, name, address condition etc.
- cette syntaxe n'admet pas ds valeurs numériques ou des noms commençant par un chiffre
- on ne peut pas non plus faire appel à des variables
Pour cela, on va faire appel à une fonction prototypée ou greffée à chaque élément du json :
.AddCode "Object.prototype.element=function( i ) { return this[i] } ; "
et on pourra alors écrire :
data.records.element(0).element("fields")
exemple complet ci-dessous :
Sub lire()
Dim ScriptEngine As Object
Set ScriptEngine = CreateObject("ScriptControl")
With ScriptEngine
.Language = "JScript"
' nombre d'occurences
.AddCode "function N(jsonObj){return jsonObj.length;} "
' pour les noms réservés par excel VBA, les valeurs numériques ou commençant par un chiffre
.AddCode "Object.prototype.element=function( i ) { return this[i] } ; "
End With
Sheets("lecture").Select
Range("A1").CurrentRegion.Offset(0, 1).ClearContents
Dim data As Object
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", [www], False
.send
Set data = ScriptEngine.Eval("(" + CStr(.responsetext) + ")")
End With
On Error Resume Next ' absence d'un élément
For i = 0 To ScriptEngine.Run("N", data.records) - 1
With data.records.element(i).element("fields") ' fields étant un nom réservé
Range("B1").Offset(0, i) = .city
Range("B2").Offset(0, i) = .element("name") ' name étant un nom réservé
Range("B3").Offset(0, i) = .element("address") ' address étant un nom réservé
Range("B4").Offset(0, i) = .price_gazole
Range("B5").Offset(0, i) = .price_sp95
Range("B6").Offset(0, i) = .price_sp98
Range("B7").Offset(0, i) = .price_e10
With ScriptEngine.Eval("(" + CStr(.timetable) + ")")
Range("B8").Offset(0, i) = .Lundi.ouverture & " - " & .Lundi.fermeture
Range("B9").Offset(0, i) = .Mardi.ouverture & " - " & .Mardi.fermeture
Range("B10").Offset(0, i) = .Mercredi.ouverture & " - " & .Mercredi.fermeture
Range("B11").Offset(0, i) = .Jeudi.ouverture & " - " & .Jeudi.fermeture
Range("B12").Offset(0, i) = .Vendredi.ouverture & " - " & .Vendredi.fermeture
Range("B13").Offset(0, i) = .Samedi.ouverture & " - " & .Samedi.fermeture
Range("B14").Offset(0, i) = .Dimanche.ouverture & " - " & .Dimanche.fermeture
End With
End With
Next
End Sub
3- autre écueil : les sites demandent une authentification explicite (utilisateur et mot de passe) ou implicite (session, token/jeton)... on verra cela aussi par la suite en simulant un navigateur !
Nouveau chapitre ... le site demande une authentification ou connexion explicite. Cette authentification est stockée dans un cookie.
Excel ne gérant pas les cookies, il faut passer par un navigateur, de préférence firefox ou chrome qui admettent la commande view-source"
#If VBA7 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
Sub telecharger()
Dim nav As Long, MyData As DataObject
Set MyData = New DataObject
Dim page As New HTMLDocument, lien As Object, lig As Integer, url As String
url = "https://forum.excel-pratique.com/ucp.php?i=pm&folder=inbox"
' premier lancement d'un site quelconque afin d'ouvrir automatiquement le navigateur
nav = ShellExecute(0, "open", "https://www.qwant.com/", 0, 0, 1)
Application.Wait (Now + TimeValue("00:00:02"))
' code pour se mettre dans la barre d'adresse et pouvoir renseigner l'url
SendKeys "%d"
Application.Wait (Now + TimeValue("00:00:01"))
' écriture de view-source: suivi de l'url
SendKeys "view-source:" & url
SendKeys "{ENTER}"
' temps d'attente du chargement complet, dépend de la qualité de la connexion et de l'état du PC
Application.Wait (Now + TimeValue("00:00:10"))
' envoi de Ctrl+a (tout sélectionner)
SendKeys "^a"
Application.Wait (Now + TimeValue("00:00:01"))
' envoi de Ctrl+c (copier)
SendKeys "^c"
Application.Wait (Now + TimeValue("00:00:01"))
' récupération du contenu du presse-papier
MyData.GetFromClipboard
txt = MyData.GetText(1)
SendKeys "%{F4}"
'Application.CutCopyMode = False
page.body.innerHTML = txt
lig = 1
Cells.Clear
For Each lien In page.getElementsByTagName("a")
Cells(lig, 1) = lien.getAttribute("HREF")
Cells(lig, 2) = lien.innerHTML
lig = lig + 1
Next lien
MsgBox "Terminé !"
End Sub
A tester sur la boite de messages privés de ce site ... la réponse sera différente qu 'on se soit enregistré -en permanence- ou pas.
Cela reste une solution très pointue et dépend de pas mal de conditions et un réglage approprié des temporisations.
Attention aussi aux droits d'accès étant donné que l'internaute a signé une charte d'accès lors de son enregistrement !