navigation internet + extraction pdf
Bonjour à tous !
Dans l'optique de créer un outil de veille réglementaire assistée, je démarre mes recherches d'applications suivantes depuis excel:
- ouvrir une page de site institutionnel fixe sur internet - OK
- pointer un lien hypertexte variable (évolue à chaque mise à jour, dénomination variable donc) - OK
- télécharger le PDF de la nouvelle version réglementaire - OK
- extraction texte et tableaux vers mon fichier excel
- tri des chapitre par onglets OU fusion des onglets
- mise en forme
Voilà pour la première phase ! Mes premières recherches m'ont amené à des bribes de code pas forcément compatibles entre elles voire non fonctionnelles...
Quelques pistes/lectures à me recommander?
Merci d'avance!
la meme avec commentaires et explication sur le fonctionnement
Citation:
Envoyé par
IronHeavy
Merci Patrick !
Cela fonctionne parfaitement... si j'ai compris ton cheminement:
- pointer le dernier lien hypertexte de la page ie
- vérifier si un fichier "monpdf" existe déjà sur le bureau
- télécharger le pdf du lien
En revanche, si changement de l'architecture su site, je veillerai bien à adapter ton code. Tu as prévu ce cas de figure en remontant le nom du lien pointé, astucieux!
Je pense agrémenter ce code en ajoutant la date de téléchargement + suppression du document précédent au nom du fichier de manière à avoir toujours un document le plus à jour possible!
re
la voila avec les commentaires d'explication
Code:
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
Sub test()
Dim chemin As String 'variable string pour la destination du fichier
Dim linck$ 'variable string pour recevoir le texte de l'url du fichier a telecharger
chemin = Environ("userprofile") & "\DeskTop\monpdf.pdf" 'on détermine le chemin
'ici on envoie a la fonction l'url de la page d'acceuil et la variable "linck"(linck est vide tres important!!!! ) MAIS !! on envoie pas chemin
telechargeFichier "https://aida.ineris.fr/liste_documents/1/18023/1", , linck
' linck a été renseigné dans la fonction ( c'est une sorte de CALLBACK)
MsgBox "le dernier lien document de la page est " & vbCrLf & linck
'si linck a été renseigné on renvoie un apel avec la meme fonction avec linck est chemin (tout deux sont renseignés)
'la fonction va donc telecharger le fichiersans passer par la page d'acceuil de ton site AIDA
'je met quand meme une condition sur linck <> de vide ca gere l'erreur et si il est vide tu le msgbox
If linck <> "" Then telechargeFichier linck, chemin Else MsgBox "le lien n'a pas été trouvé verifier le code source"
End Sub
Sub telechargeFichier(url As String, Optional chemin As String = "", Optional linck)
Dim ReQ As Object, oStream As Object
'On Error Resume Next 'On ne gère pas les erreurs
Set ReQ = CreateObject("Microsoft.XMLHTTP") 'on créé l'object pour faire la requete
ReQ.Open "get", url, False 'on ouvre la requete
ReQ.send 'on envoie
'!!!!!! C EST MAINTENANT CI DESSOUS QUE CA SE JOUE
If chemin = "" Then ' si on a pas appelé avec chemin ou chemin est videc'est qu'on veut aller scruter la page d'acceuil
With CreateObject("htmlfile") 'on créé alors un document html en memoire
.body.innerhtml = ReQ.responsetext ' et on lui met le RESPONSETEXT de la requete ((qui correspond au code source de la page d'acceuil))
'et on l'annalyse comme si on etait dans le document de la page dans IE
'ici on va donc boucler pour recuperer le href des balise "A" qui sont les childnodes(0) elements de class"lien-document"
'a chaque trouvé linck recoit l'url(href)
'ET!!!!comme on est dans un (((!!!htmldocument en memoire!!!)))) la racine des liens"href" n'est pas mise a jour et donc remplacé par "about:"
For Each elem In .all
If elem.classname = "lien-document" Then linck = Replace(elem.ChildNodes(0).href, "about:", "https://aida.ineris.fr") ': MsgBox linck
Next
'a ce niveau de la fonction ici on a maintenant le derner href et donc l'url du fichier
End With
'la fonction ne fait plus rien a partir d'ici si chemin etait vide
Else
'si chemin n'est pas vide
'on kill donc l'ancienne version du fichier
If Dir(chemin) <> "" Then Kill chemin
'et on créé le nouveau avec adobstream AVEC CETTE FOIS CI LE RESPONSEBODY DE LA REQUETE car l'url injectée n'est pas une page web mais bel et bien le lien d'un fichier
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1
oStream.Write ReQ.responsebody
oStream.SaveToFile chemin
oStream.Close
End If
End Sub |
et oui si demain l'architecture de la page d'accueil ou le nom de class des element changent , il te faudra modifier le scrute (for each... in .all)
si je voudrais la rendre plus générique que cela
je séparerais le scrute dans une autre fonction et seule alors cette 3 eme fonction serait a modifier
ca peut se faire si tu veux
;)
élargissement du champ réglementaire
Bonjour,
Les premières avancées sur mon projet de veille réglementaire me laissent augurer d'une faisabilité probable (reste à régler le souci de l'extraction pdf vers excel...)
Je compte étendre le fonctionnement de mon outil à d'autres réglementations que celle des Installations Classées pour la Protection de l'Environnement:
- REACH
- CLP
puis dans un second volet
- SEVESO
- ROHS
Pour les règlement REACH et CLP, la source n'est plus AIDA INERIS mais ECHA...
En revanche, les nomenclatures proposées sont directement disponibles en XLS ! Je souhaiterais donc adapter le code proposé par Patrick à mes utilisations futures
Par exemple pour la liste des substances REACH:
https://echa.europa.eu/fr/informatio...red-substances
j'ai localisé l'adresse de la commande d'export XLS:
Code:
<button class="btn exportBTN" id="_dissregisteredsubstances_WAR_dissregsubsportlet_exportButtonXLS" onclick="_dissregisteredsubstances_WAR_dissregsubsportlet_exportData('xls');" type="button"> XLS </button>
Quels infos dois-je conserver pour lancer le téléchargement?
Merci.