Page 1 sur 3

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

Publié : sam. 07/sept./2013 21:04
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.

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

Publié : sam. 07/sept./2013 21:25
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

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

Publié : sam. 07/sept./2013 23:48
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.

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

Publié : dim. 08/sept./2013 1:33
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.

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

Publié : dim. 08/sept./2013 9:12
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.

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

Publié : dim. 08/sept./2013 10:32
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.

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

Publié : dim. 08/sept./2013 10:32
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.

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

Publié : dim. 08/sept./2013 14:57
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+

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

Publié : dim. 08/sept./2013 16:23
par Ar-S
@Papipp,
Salut,
Ton code n'affiche pas la source dans son intégralité (pb5.20b17 x86 sous w8x64).

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

Publié : dim. 08/sept./2013 17:26
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")

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

Publié : dim. 08/sept./2013 17:57
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+

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

Publié : dim. 08/sept./2013 18:12
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.

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

Publié : lun. 09/sept./2013 8:18
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+

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

Publié : lun. 09/sept./2013 11:01
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.

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

Publié : lun. 09/sept./2013 11:41
par kernadec
bonjour
merci a tous

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

Cordialement