Enregistrer une page web en TXT

Enregistrer une page web en TXT - VB/VBA/VBS - Programmation

Marsh Posté le 03-04-2007 à 10:17:44    

Bonjour,
Je cherche à automatiser sous Excel ou Access l'enregistrement d'une page Internet en .txt.
Est-ce que quelqu'un connait un code qui permet de faire cela sans être obligé de le faire à la main via le navigateur Internet "Enregistrer Sous en fichier Texte".
Merci.

Reply

Marsh Posté le 03-04-2007 à 10:17:44   

Reply

Marsh Posté le 03-04-2007 à 11:33:44    

Bonjour,
 
Tu peux adapter ca à un fichier texte (à la place de wb.worksheets(1) :
 
 
Public Sub runIEAndCopyPaste()
Dim dRetVal As Double
Dim wb As Workbook
 
dRetVal = Shell("C:\Program Files\Internet Explorer\IEXPLORE.EXE http://www.google.fr/search?q=hello+world", vbNormalFocus)
wait 2
SendKeys "^a^c", True
'wait 1
SendKeys "%{F4}", True
Set wb = Workbooks.Add
wb.Worksheets(1).Paste
End Sub
 
Private Sub wait(Secondes As Integer)
' Cette procédure temporise pendant le nombre
' de secondes qu'on lui transmet en argument
Dim Début As Long, Fin As Long
 
    Début = Timer
    Fin = Début + Secondes
    Do Until Timer >= Fin
        DoEvents
    Loop
End Sub
 
Alors c'est pas du beau code, je sais, à améliorer, c'est juste une piste, mais ca semble fonctionner.

Reply

Marsh Posté le 03-04-2007 à 11:45:33    

Je te remercie.
"Tu peux adapter ca à un fichier texte (à la place de wb.worksheets(1)" --> c'est mon problème j'arrive à enregistrer une page web sous word ou sous excel mais je ne trouve pas comment l'enregistrer directement dans un fichier texte.
 
Le code suivant passe par une feuille Excel puis enregistrement dans un .txt
Set fich = Workbooks.Open("http://groups.google.fr/groups/search?hl=fr&lr=lang_fr&q=VBA+copier+feuille+en+txt" )
ActiveWorkbook.SaveAs Filename:="e:\text.txt", FileFormat:=xlText, CreateBackup:=False
fich.Close
 
Or si la page Web est très grande tout ne passe pas dans excel et je perd des données, c'est pour cela que je souhaite enregistrer directement en Texte.
 
As-tu une idée ?
Merci.

Reply

Marsh Posté le 03-04-2007 à 12:01:48    

Pour un document word, il faut créer un objet (application word), mais pour un fichier texte qu'elle est le nom de cette classe ?
 
ex pour word : Set MyWord = CreateObject(Class:="Word.Document" )
s'il y avait une possibilité de passer par cette méthode je pense que mon problème serait résolu.
Est-ce que quelqu'un connait la classe associée à un fichier texte ? (je ne trouve pas sur le net).
Merci.

Reply

Marsh Posté le 03-04-2007 à 13:13:08    

Je dois aller déjeuner, je te trouve qqchose en rentrant...

Reply

Marsh Posté le 03-04-2007 à 15:06:58    

Ce code fonctionne :
 
Option Explicit
 
 
 
Private Sub wait(Secondes As Integer)
' Cette procédure temporise pendant le nombre
' de secondes qu'on lui transmet en argument
Dim Début As Long, Fin As Long
 
    Début = Timer
    Fin = Début + Secondes
    Do Until Timer >= Fin
        DoEvents
    Loop
End Sub
 
Public Sub runIEAndCopyPaste()
Dim dRetVal As Double
Dim ObjTextStream As Object, FSO As Object
Dim MyDataObj As DataObject
Dim str As String
 
Set MyDataObj = New DataObject
 
dRetVal = Shell("C:\Program Files\Internet Explorer\IEXPLORE.EXE http://support.microsoft.com/kb/183644/fr", vbNormalFocus)
wait 5
SendKeys "^a^c", True
SendKeys "%{F4}", True
 
MyDataObj.GetFromClipboard
str = MyDataObj.GetText(1)
 
Set FSO = CreateObject("Scripting.FileSystemObject" )
Set ObjTextStream = FSO.OpenTextFile("C:\Medialand\Text.txt", 2, True)
ObjTextStream.Write str
ObjTextStream.Close
End Sub
 
On doit évidemment pouvoir trouver bcp mieux.
d'autant que l'entier qu'on applique à wait peut être insuffisant si la page tarde à se charger.
Il existe une fonction qui atend le chargement des pages Internet... je cherche ca.

Reply

Marsh Posté le 03-04-2007 à 15:16:43    

Reply

Marsh Posté le 03-04-2007 à 17:14:17    

aprilthe5ith a écrit :

Ce code fonctionne :
 
Option Explicit
 
 
 
Private Sub wait(Secondes As Integer)
' Cette procédure temporise pendant le nombre
' de secondes qu'on lui transmet en argument
Dim Début As Long, Fin As Long
 
    Début = Timer
    Fin = Début + Secondes
    Do Until Timer >= Fin
        DoEvents
    Loop
End Sub
 
Public Sub runIEAndCopyPaste()
Dim dRetVal As Double
Dim ObjTextStream As Object, FSO As Object
Dim MyDataObj As DataObject
Dim str As String
 
Set MyDataObj = New DataObject
 
dRetVal = Shell("C:\Program Files\Internet Explorer\IEXPLORE.EXE http://support.microsoft.com/kb/183644/fr", vbNormalFocus)
wait 5
SendKeys "^a^c", True
SendKeys "%{F4}", True
 
MyDataObj.GetFromClipboard
str = MyDataObj.GetText(1)
 
Set FSO = CreateObject("Scripting.FileSystemObject" )
Set ObjTextStream = FSO.OpenTextFile("C:\Medialand\Text.txt", 2, True)
ObjTextStream.Write str
ObjTextStream.Close
End Sub
 
On doit évidemment pouvoir trouver bcp mieux.
d'autant que l'entier qu'on applique à wait peut être insuffisant si la page tarde à se charger.
Il existe une fonction qui atend le chargement des pages Internet... je cherche ca.


 
--> Je te remercie, je teste ça.

Reply

Marsh Posté le 03-04-2007 à 17:50:45    

Merci, cela fonctionne très bien.
Petite précision (au cas où) : il faut activer Microsoft forms 2.0 Object Library, dans Outils/Références ;-)

Reply

Marsh Posté le 03-04-2007 à 18:07:10    

Mais va effectivement voir sur le lien que je t'a envoyé, le code est bcp plus pro.

Reply

Marsh Posté le 03-04-2007 à 18:07:10   

Reply

Marsh Posté le 10-04-2007 à 15:20:14    

Merci c'est ce que je suis entrain de voir, mais il faut référencer IE en chargeant la bibliothèque associée, mais je ne la trouve pas dans la liste de références déjà chargée.  
Peux tu me donner le chemin de la DLL à charger (je ne la trouve pas ) ? Merci

Reply

Marsh Posté le 10-04-2007 à 17:18:16    

J'ai un problème avec la récupération des données d'une page très grosse.
Que ce soit avec ta solution ou bien celle CHAPATA (lien donné) lors de la récupération des données cela plante et quelques fois très rares cela met plus de 20 minutes pour récupérer les données d'une page, or j'ai ~200 pages à récupérer et cela tous les jours !
As-tu une solution ? (sachant que de changer de matériel et de réseau cela n'est pas possible :-(  
 
Merci.

Reply

Marsh Posté le 11-04-2007 à 01:23:28    

je regarde ca des demain, promis

Reply

Marsh Posté le 11-04-2007 à 02:28:31    

... Pour la dll, il me semble que c'est, dans outils/références : Microsoft Internet Controls

Reply

Marsh Posté le 11-04-2007 à 09:09:28    

Sous forme de Script VBS ( plus rapide )


sData = GetXml("http://support.microsoft.com/kb/183644/fr" )
sData = HtmlToText(sData)
WriteFile "C:\Transfert\Web2Txt\web.txt", sData
 
Function HtmlToText(sHtml)
    With CreateObject("htmlfile" )
        .Write sHtml
        HtmlToText = .body.innertext
    End With
End Function
 
Function GetXml(sURL)
Dim Xml
    Set Xml = CreateObject("Microsoft.XMLHTTP" )
    Xml.Open "GET", sURL
    Xml.send
    Do: wscript.sleep 10: Loop While Xml.ReadyState <> 4
    GetXml = Xml.responseText
End Function
 
Sub WriteFile(FilePath, sData)
    With CreateObject("Scripting.FileSystemObject" ).OpenTextFile(FilePath, 2, True)
        .Write sData: .Close
    End With
End Sub

Reply

Marsh Posté le 11-04-2007 à 11:58:27    

Ca a l'avantage d'être court !
Si ca fonctionne... parfait, bravo.

Reply

Marsh Posté le 12-04-2007 à 13:05:40    

Je te remercie,
je ne connaissais pas, je regarde celà plus dans le détail afin de boucler sur mes différentes pages.
 
J'ai encore deux questions :
1. à partir d'access (l'application principale est une base access), peut-on lui dire exécute le script HTMLtoTXT.vbs ?
2. peut-on prendre des valeurs se situant dans un fichier texte
exemple, j'aimerai pouvoir faire :
sData = GetXml("http://montest_" & Var1 & "." & Var2 & ".html" )  
avec Var1 et Var2 des variables dont les valeurs se trouvent dans un fichier texte ?
 
Encore merci.

Reply

Marsh Posté le 12-04-2007 à 13:55:21    

J'ai réfléchis un peu ... ^^
et avec tout ce que vous m'avez expliqué  
pour ma question 2, j'ai fait :
Dim fso, f, var1
Set fso = CreateObject("Scripting.FileSystemObject" )
Set f = fso.OpenTextFile("E:\var1.txt", 1)
var1 = f.Read(2)
 
et cela fonctionne bien !
 
par contre pour la question 1  ? je ne connais pas la commande pour lancer un script via Access.

Reply

Marsh Posté le 12-04-2007 à 14:29:41    

pit-bull a écrit :

1. à partir d'access (l'application principale est une base access), peut-on lui dire exécute le script HTMLtoTXT.vbs ?


en lancant une ligne de commande Shell :)

Reply

Marsh Posté le 12-04-2007 à 16:51:20    

Merci.
Tout fonctionne, mais par contre cela met toujours entre 10 et 20 min.
Pour info, une fois enregistrer en .txt la taille du fichier est de 8Mo, donc la page web est très conséquente. Avez-vous une solution ? Car là je suis entrain de me demander si l'automatisation de ces pages web est vraiment possible ... (manuellement c'est beaucoup plus rapide, mais très contraignant !)
 
Merci.

Reply

Marsh Posté le 12-04-2007 à 16:54:39    

deja tu peux diminuer ton wscript.sleep à 5 ;)

Reply

Marsh Posté le 12-04-2007 à 17:44:19    

Merci, cela met maintenant 6 minutes pour copier une page.
GRRRR ...
c'est mieux, mais non validable  ;-(
 
vois tu comment je peux faire avec des pages aussi grosses ?
Je te remercie.

Reply

Marsh Posté le 12-04-2007 à 18:01:22    

pit-bull a écrit :

Merci, cela met maintenant 6 minutes pour copier une page.
GRRRR ...
c'est mieux, mais non validable  ;-(
 
vois tu comment je peux faire avec des pages aussi grosses ?
Je te remercie.


je ne comprends pas comment on peut avoir un fichier txt de 8Mo, tu copies des pages web avec du code de cochon ?  :sweat:

Reply

Marsh Posté le 13-04-2007 à 02:13:12    

8 meg... c'est dingue... en même temps un xls de seulement 5 onglets bien remplis de chiffres peut facile faire 3 meg...
 
Par ailleurs pour le tmps d'execution, il existe des méthodes hyper rapides qui scrutent Internet sans l'afficher (un de mes potes fait ca sur des sites pro de finance)... je vois avec lui et j'essaie de te répondre... c'est une sujet qui m'interesse.
 
Eventually, tu peux nous montrer ton code, histoire qu'on comprenne, le Jp et moi.

Reply

Marsh Posté le 13-04-2007 à 10:08:24    

Merci pour votre implication.
Par contre j'ai un petit soucis que je viens de voir tout de suite.
Si je fais manuellement via l'explorateur enregistrer sous en .txt mon fichier fait plus d'1Mo en plus par rapport à celui qui est automatisé (donc 9).
Quand je regarde le corps du fichier automatisé toutes les lettres sans accents sont effacés donc c'est un peu génant. Savez-vous d'où cela peut venir ?
 
En ce qui concerne le code j'ai adapté celui de kiki29 à mes fichiers. J'ai rien inventé de nouveau.
et en ce qui concerne le code access, ce n'est pas ça qui bloque, c'est vraiment le script qui tourne longtemps.
 
Je ne peux pas vous donner d'exemple de pages Web dont je veux récupérer le contenu en .txt car c'est Inter-entreprise.
Mais ce type de page web sont énormes croyez moi !

Reply

Marsh Posté le 13-04-2007 à 10:26:11    

erreur de ma part ... c'est avec accent
--> Quand je regarde le corps du fichier automatisé toutes les lettres AVEC accents sont effacées donc c'est un peu génant. Savez-vous d'où cela peut venir ?

Reply

Marsh Posté le 13-04-2007 à 11:02:36    

pit-bull a écrit :

erreur de ma part ... c'est avec accent
--> Quand je regarde le corps du fichier automatisé toutes les lettres AVEC accents sont effacées donc c'est un peu génant. Savez-vous d'où cela peut venir ?


regarde avec des debug.print si ton texte est sans accent des le debut ou dans la derniere étape ...

Reply

Marsh Posté le 13-04-2007 à 12:21:35    

dès le début, j'ai un carré et quand il écrit dans le fichier texte, il ne met rien.

Reply

Marsh Posté le 16-04-2007 à 10:51:35    

Je n'arrive toujours pas à gérer les lettres avec accents, je ne vois pas d'où cela peut venir.
La conversion est toujours aussi lente ...
je désespère !
 
Sous Access je lance le script comme ceci :
Shell """C:\WINNT\system32\WScript.exe"" ""E:\HTML_TXT.vbs""", vbMaximizedFocus
et j'aimerais que tant que le script n'est pas fini (~6 minutes), la suite du code Access n'est pas exécuté.
En effet, actuellement le script est lancé et la suite du code Access est lancé aussi, or il fait référence au fichier .txt créé dans le script vbs donc il ne le trouve pas et rien ne se passe.
Savez vous comment attendre que le script soit terminé ?
 
Je vous remercie pour votre aide sur ces trois éléments.

Reply

Marsh Posté le 04-05-2007 à 09:35:16    

je reviens vers vous concernant ce problème. Est-ce que quelqu'un a une idée pour automatiser cet enregistrement en txt ?
Merci d'avance, je séche vraiment.

Reply

Marsh Posté le 04-05-2007 à 11:05:51    

AprilThe5th a écrit :

8 meg... c'est dingue... en même temps un xls de seulement 5 onglets bien remplis de chiffres peut facile faire 3 meg...
 
Par ailleurs pour le tmps d'execution, il existe des méthodes hyper rapides qui scrutent Internet sans l'afficher (un de mes potes fait ca sur des sites pro de finance)... je vois avec lui et j'essaie de te répondre... c'est une sujet qui m'interesse.
 
Eventually, tu peux nous montrer ton code, histoire qu'on comprenne, le Jp et moi.


 
"il existe des méthodes hyper rapides qui scrutent Internet sans l'afficher " --> as-tu eu des nouvelles vers ton ami ?
Je n'ai pas trouvé de solution à mon problème de lenteur.
 
Je te remercie.

Reply

Marsh Posté le 04-05-2007 à 15:59:24    

Je le vois ce WE, je te tiens aucourant.
... J'avais carrément oublié, tu fais bien de me le rappeler.

Reply

Marsh Posté le 23-05-2007 à 14:13:43    

Je suis de retour.
Donc... je ne comprends pas : la méthode donnée par kiki29 fonctionne super bien, super rapidement et sans ouvrir IE...
Si les fichiers générés sont trop importants, c'est parece que le volume de données est également important... et je ne vois pas ce qu'on pourrait y faire...

Reply

Marsh Posté le 01-04-2009 à 13:27:47    

Salut à tous,
 
J'ai un petit soucis :
J'ai besoin d'une fonction "wait" pour une macro.
J'ai utilisé celle de "aprilthe5ith" avec le timer, mais la fonction bug parfois (aléatoirement)
 

Citation :

Private Sub wait(Secondes As Integer)
' Cette procédure temporise pendant le nombre
' de secondes qu'on lui transmet en argument
Dim Début As Long, Fin As Long
 
    Début = Timer
    Fin = Début + Secondes
    Do Until Timer >= Fin
        DoEvents
    Loop
End Sub  


 
J'ai cherché sur pas mal de forum, j'ai trouvé la fonction "Sleep" qui marche très bien, mais malheureusement ce n'est pas du tout ce que je veux.
 
Enfin, j'ai trouvé cette fonction, mais idem que pour le timer la fonction ne s'exécute pas tous le temps.(la encore ça semble aléatoire). Ce qui fait que les touches du clavier n'ont pas le temps de s'activer normalement...
 

Citation :

Private Sub Attendre()
    Dim MaDate As Date
      MaDate = Now
    Do While Abs(DateDiff("s", MaDate, Now)) < 1
        DoEvents
    Loop
End Sub


 
 
Dans ma macro, j'appel la fonction de nombreuses fois d'affiler et pour un laps de temps très court. (Le problème viens peut être de la)
Voici ma un morceau de ma macro
 

Citation :


For i = 1 To 20 Step 2
exapp.Cells.Hyperlinks(i).Follow True
   Attendre  
  SendKeys ("^{f}" )
  Attendre
  SendKeys ("{ENTER}" )
  Attendre
  SendKeys ("{ESC}" )
  Attendre
  SendKeys ("^a" ), True
  Attendre
  SendKeys ("^c" ), True
  Selection.Paste
Next


 
 
L'un d'entre vous a t'il une idée à mon problème??
 
Merci d'avance


Message édité par azer250 le 01-04-2009 à 13:40:46
Reply

Marsh Posté le 06-04-2009 à 00:26:52    

Personne a une idée?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed