WebGadget() et récupération du code html d'une page web...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
bloiiing
Messages : 53
Inscription : sam. 09/janv./2010 9:16

WebGadget() et récupération du code html d'une page web...

Message par bloiiing »

Bonjour,

Je voudrais récupérer le code html d'une page web dans une variable texte. J'ai trouvé dans un forum une solution qui fonctionne mais qui fait plus de 250 lignes. J'ai donc voulu voir si il n'y avait pas plus simple car le problème est tout ce qu'il y a de plus trivial et j'ai écrit ce petit bout de code en m'inspirant d'un code donné dans l'aide de PB.

Code : Tout sélectionner

If OpenWindow(0,0,0,600,300,"WebGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  WebGadget(1,10,10,580,280,"http://www.purebasic.com")
  Resultat$ = GetGadgetItemText(1, #PB_Web_HtmlCode)
  Debug Resultat$
  Repeat 
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Ça ne marche pas et je ne sais pas pourquoi... Est-ce que le paramètre #PB_Web_HtmlCode est bien utilisé?

Je m'excuse de ma question basique mais je ne sais pas pourquoi ça bloque.

Merci d'avance.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WebGadget() et récupération du code html d'une page web.

Message par falsam »

Il faut attendre la fin du téléchargement de la page #PB_EventType_DownloadEnd

Code : Tout sélectionner

If OpenWindow(0,0,0,600,300,"WebGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  WebGadget(1,10,10,580,280,"http://www.purebasic.com")
  
      
  Repeat 
    Event = WaitWindowEvent()
    GEvent = EventGadget()
    TEvent = EventType()
    
    Select Event
      Case #PB_Event_Gadget
        Select GEvent
          Case 1
            Select TEvent
              Case #PB_EventType_DownloadEnd     
                Resultat$ = GetGadgetItemText(1, #PB_Web_HtmlCode)
                Debug Resultat$
            EndSelect
        EndSelect
        
          Case #PB_Event_CloseWindow
        End
        
    EndSelect
    
  ForEver
  
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: WebGadget() et récupération du code html d'une page web.

Message par nico »

Oui enfin, il faut savoir qu'on ne peut pas toujours utiliser #PB_EventType_DownloadEnd car on reçoit plusieurs évènements, cela ne fait que 5 ans que j'ai posté le problème, mais je crois que tout le monde s'en fout.
Avatar de l’utilisateur
bloiiing
Messages : 53
Inscription : sam. 09/janv./2010 9:16

Re: WebGadget() et récupération du code html d'une page web.

Message par bloiiing »

Merci, ça semble venir de là. Mais ça ne récupère pas le code html entièrement. Je n'ai que les en-têtes... Mais en tout cas je progresse vers la solution.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: WebGadget() et récupération du code html d'une page web.

Message par nico »

Non, ça récupère bien tout le code HTML, si ce n'est pas le cas, c'est qu'il y a un problème dans ton code. Par contre, tu ne récupères pas les imports CSS et JAVASCRIPT lorsqu'ils sont dans des fichiers externes.
Avatar de l’utilisateur
bloiiing
Messages : 53
Inscription : sam. 09/janv./2010 9:16

Re: WebGadget() et récupération du code html d'une page web.

Message par bloiiing »

Oui, je viens d'essayer et effectivement c'est comme tu dis. Ça ne récupère que le code html mais c'est ce qu'il me fallait.

Merci.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: WebGadget() et récupération du code html d'une page web.

Message par Ar-S »

nico a écrit :Non, ça récupère bien tout le code HTML, si ce n'est pas le cas, c'est qu'il y a un problème dans ton code. Par contre, tu ne récupères pas les imports CSS et JAVASCRIPT lorsqu'ils sont dans des fichiers externes.
Et encore, en analysant la source, on a vite fait de connaître leurs chemins et de les récupérer/lire si besoin.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: WebGadget() et récupération du code html d'une page web.

Message par PAPIPP »

Bonjour à tous
pour éviter le pb posé par nico avec #PB_EventType_DownloadEnd
Voici un prg qui peut répondre à cette difficulté.
de Nico
Oui enfin, il faut savoir qu'on ne peut pas toujours utiliser #PB_EventType_DownloadEnd car on reçoit plusieurs évènements, cela ne fait que 5 ans que j'ai posté le problème, mais je crois que tout le monde s'en fout.

Code : Tout sélectionner

OpenConsole("resultat")
If OpenWindow(0,0,0,600,300,"WebGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	WebGadget(1,10,10,580,280,"http://www.purebasic.com")
	dep.q=ElapsedMilliseconds()
	flag=0
  Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode)
  dlres=Len(resultat$)
	Repeat
    Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode)
    lres=Len(resultat$)
;     Debug _n(lres)+_n(mlres)+_n(flag)
    If lres=mlres And flag=0 And lres>dlres
;       Debug Resultat$
      PrintN(Resultat$)
      PrintN( Str(ElapsedMilliseconds()-dep))
;       Debug _n(ElapsedMilliseconds()-dep)
      flag+1
    EndIf 
    mlres=lres
	Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
CloseConsole()

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: WebGadget() et récupération du code html d'une page web.

Message par Ar-S »

@Papipp,
Salut,
Ton code n'affiche pas la source dans son intégralité (pb5.20b17 x86 sous w8x64).
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WebGadget() et récupération du code html d'une page web.

Message par falsam »

S'il s'agit uniquement de récupérer le code html d'une page essayes ce code que tu sauvegardes avant de l'éxécuter.

Code : Tout sélectionner

InitNetwork()

If Not ReceiveHTTPFile("http://www.purebasic.com", "test.html")
  Debug "Ooops : Souci de réception "
  End
EndIf

If ReadFile(0, "test.html")
  While Not Eof(0)
    Debug ReadString(0)
  Wend
EndIf

;Juste pour voir
RunProgram("test.html")
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: WebGadget() et récupération du code html d'une page web.

Message par PAPIPP »

A falsam:
Très bon prg merci
Et comme cela c'est un plus complet.

Code : Tout sélectionner

OpenConsole("resultat")
If OpenWindow(0,0,0,600,300,"WebGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  WebGadget(1,10,10,580,280,"http://www.purebasic.com")
  dep.q=ElapsedMilliseconds()
  flag=0
  PrintN(_n(#PB_Web_HtmlCode))
  ;   Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode)
  Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode     )
  dlres=Len(resultat$)
  Repeat
    Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode)
    lres=Len(resultat$)
    ;     Debug _n(lres)+_n(mlres)+_n(flag)
    If lres=mlres And flag=0 And lres>dlres
      Resultat$+GetGadgetItemText(1,#PB_Web_PageTitle )
      Resultat$+GetGadgetItemText(1,#PB_Web_StatusMessage )
      Debug Resultat$
      PrintN(Resultat$)
      ;       Debug _n(ElapsedMilliseconds()-dep)
      flag+1
      PrintN( Str(ElapsedMilliseconds()-dep))

    EndIf 
    
    mlres=lres
  Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
CloseConsole()
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WebGadget() et récupération du code html d'une page web.

Message par falsam »

@PAPIPP : Ton code génère une erreur de compilation mais surtout n'a aucun rapport avec celui que je propose puisque je n'utilise pas de webgadget.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: WebGadget() et récupération du code html d'une page web.

Message par PAPIPP »

Bonjour à tous
@ Ar_s et falsam
Vous avez très certainement utilisé la sortie de debug pour contrôler ou pour réaliser un fichier html
Et là il faut bien reconnaitre qu’il y a un pb
En effet la sortie sur console par printn et la sortie avec debug ne sont pas identiques avec webgadget
Test_printn fait exactement 14525 assez stable en fonction des différents tests
Test_debug fait moins de 14525 octets cette longueur peu variée en fonction des différents essais
Remarques :

1) il y a un pb avec l’instruction debug pour des chaines de caractères et l’utilisation de webgadget
2) Pour être sûr que les fichiers html sortie des programmes de falsam et du mien sont parfaitement corrects, j’ai modifié le premier Prg de falsam pour d’une part lui faire une sortie sur printn et d’autre part une sortie directe sur un fichier Test_Fal.html
et j’ai fait de même pour le mien.
3) Pour faire le tour de la question j’ai modifier le dernier prg de falsam pour réaliser un debug.
Et horreur le fichier ainsi réalisé est correct.

4) Question pourquoi debug utilisé dans les prg avec un webgadget donne des résultats faux
Alors que celui issu du dernier prg de falsam est correct
5) Les trois programmes donnent les mêmes résultats en fichier html mais pour le deux prg avec webgadget il est impossible de lancer un RunProgram("TEST_FAL.html")
Ou RunProgram("TEST_PP.html
Allez dans le répertoire des sources pour tester les deux fichier html

Voici les deux prg de falsam et le mien modifiés pour réaliser les essais. Ils sont dans l'ordre chronologique

Code : Tout sélectionner

OpenConsole("resultat")
CreateFile(0,"TEST_FAL.html")
If OpenWindow(0,0,0,600,300,"WebGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  WebGadget(1,10,10,580,280,"http://www.purebasic.com")
  
  Repeat
    Event=WaitWindowEvent()
    GEvent=EventGadget()
    TEvent=EventType()
    
    Select Event
      Case #PB_Event_Gadget
        Select GEvent
          Case 1
            Select TEvent
              Case #PB_EventType_DownloadEnd
                Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode)
                PrintN(Resultat$)
                Debug Resultat$
               WriteString(0,Resultat$,#PB_UTF8)
            EndSelect
        EndSelect
        
      Case #PB_Event_CloseWindow
        End
        
    EndSelect
    
  ForEver
  
EndIf
CloseConsole()
CloseFile(0)
; Delay(1000);                 
; RunProgram("TEST_FAL.html")

Code : Tout sélectionner

OpenConsole("resultat")
CreateFile(0,"TEST_PP.html")
If OpenWindow(0,0,0,1250,850,"WebGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  WebGadget(1,10,10,1200,800,"http://www.purebasic.com")
  dep.q=ElapsedMilliseconds()
  flag=0
;   PrintN(_n(#PB_Web_HtmlCode))
  ;   Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode)
  Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode     )
  dlres=Len(resultat$)
  Repeat
  Delay(10)
    Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode)
    lres=Len(resultat$)
    ;     Debug _n(lres)+_n(mlres)+_n(flag)
    If lres=mlres And flag=0 And lres>dlres
      Resultat$=GetGadgetItemText(1,#PB_Web_HtmlCode)
      Resultat$=GetGadgetItemText(1,#PB_Web_PageTitle )+Resultat$
      Resultat$+GetGadgetItemText(1,#PB_Web_StatusMessage )
      PrintN(Resultat$)
      Debug Resultat$
      WriteString(0,Resultat$,#PB_UTF8)
      ;       Debug _n(ElapsedMilliseconds()-dep)
      flag+1
;       PrintN( Str(ElapsedMilliseconds()-dep))

    EndIf 
    
    mlres=lres
  Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
CloseConsole()
CloseFile(0)
; RunProgram("TEST_PP.html")

Code : Tout sélectionner

InitNetwork()

If Not ReceiveHTTPFile("http://www.purebasic.com", "test.html")
	Debug "Ooops : Souci de réception "
	End
EndIf

If ReadFile(0, "test.html")
	While Not Eof(0)
		Debug ReadString(0)
	Wend
EndIf

;Juste pour voir
RunProgram("test.html")
OpenFile(0,"test.html",#PB_File_SharedRead )
resultat$=ReadString(0, PB_Ascii )   
; resultat$=ReadString(0, #PB_UTF8)   
Debug resultat$
CloseFile(0)
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: WebGadget() et récupération du code html d'une page web.

Message par Mesa »

Sans utiliser de WebGadget mais pour Windows seulement :

En passant par un fichier temporaire :

Code : Tout sélectionner

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=14500&highlight=
; Author: Flype
; Date: 24. March 2005
; OS: Windows
; Demo: No



url$  = "http://www.purebasic.com" 
file$ = "c:\urldownload.txt" 

If InternetGetConnectedState_(@flags,#Null) 
  
  hResult = URLDownloadToFile_(#Null,url$,file$,#Null,#Null) 
  
  If hResult = #S_OK 
    RunProgram("notepad",file$,"") 
  Else 
    MessageRequester("Error","The operation failed. Return Code = "+Hex(hResult),#MB_ICONERROR) 
  EndIf 
  
Else 
  
  MessageRequester("Error","You are connected to internet",#MB_ICONERROR) 
  
EndIf 
Sans fichier temporaire mais ne fonctionne pas partout:
peut-être qu'en regardant ici http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Code : Tout sélectionner


; German forum: http://www.purebasic.fr/german/viewtopic.php?t=3197&start=10
; Author: Andre (based on code of Dige, posted by Epyx)
; Date: 01. May 2005
; OS: Windows
; Demo: No


; Get text contents of an internet site
; Text einer Internetseite auslesen



Procedure.l GB_DownloadToMem ( url.s, *lpRam, ramsize.l ) 
  Protected agent.s, hINet.l, hData.l, bytes.l 
  
  
  ;  #INTERNET_OPEN_TYPE_DIRECT    = 1 
  ;  #INTERNET_DEFAULT_HTTP_PORT   = 80 
  ;  #INTERNET_SERVICE_HTTP        = 3 
  ;  #INTERNET_FLAG_NO_CACHE_WRITE = $4000000 
  ;  #INTERNET_FLAG_RELOAD         = $8000000 
  
  ; Voir ici http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098%28v=vs.85%29.aspx
  
  agent.s = "Mozilla/4.0 (compatible; ST)" 
  hINet.l = InternetOpen_ ( @agent.s,0,0,0,0 ) 
  hData.l = InternetOpenUrl_ ( hINet, @url.s, "", 0, 80|$4000000, 0 ) ;80
  
  If hData > 0 : InternetReadFile_ ( hData, *lpRam, ramsize.l, @bytes.l ) : Else : bytes = -1 : EndIf 
  
  InternetCloseHandle_ (hINet) 
  InternetCloseHandle_ (hFile) 
  InternetCloseHandle_ (hData) 
  ProcedureReturn bytes.l 
EndProcedure 


*MemoryID = AllocateMemory(5000000)
If *MemoryID
  sitelength = GB_DownloadToMem("http://www.purebasic.com/", *MemoryID, 5000000)
  If sitelength > 0
    ;Debug "Le site chargé a une taille de: " + Str(sitelength) + " Bytes"
    text$ = PeekS(*MemoryID)
    ;Debug text$
  Else
    Debug "Impossible de charger la page demandée!"
  EndIf
Else
  Debug "Impossible d'allouer la mémoire requise!"
EndIf
If OpenWindow(0, 0, 0, 800, 700, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
    EditorGadget(0, 8, 8, 750, 633) 
    For a = 0 To 5 
      AddGadgetItem(0, a, "Ligne "+Str(a)) 
    Next 
SetGadgetText(0, Text$)

    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
  EndIf 


Tous ces codes proviennent de http://purearea.net/pb/english/index.htm

Mesa.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: WebGadget() et récupération du code html d'une page web.

Message par kernadec »

bonjour
merci a tous

@Mesa avec RunProgram("wordpad",file$,"") c'est plus complet :wink:

Cordialement
Répondre