Abschneiden HTML Header

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Abschneiden HTML Header

Beitrag von kunstlust »

Ich würde gerne eine einfache Lösung finden um die Headerdaten von verschieden Seiten ab "<!DOCTYPE " oder "<html>" wegzuschneiden. Das Problem ist das die Daten wohl vom "ReceiveNetworkData" nicht Zeilenweise ankommen und so meine Idee den String mit Count zu prüfen nicht geht.

Könnt ihr mir einen Tip geben, wie es logisch anzugehen ist? Danke

Code: Alles auswählen

InitNetwork()

id = OpenNetworkConnection("de.selfhtml.org", 80)
SendNetworkString(id, "GET /html/kopfdaten/titel.htm HTTP/1.1" + Chr(10) + "Host: de.selfhtml.org" + Chr(10) +Chr(10) )
Repeat
  If NetworkClientEvent(id) = 2
    a$ = Space(2048)
    ReceiveNetworkData(id, @a$, 2048)
  EndIf
   If  CountString(a$, "<") = 1 ; geht nur mit > 1 und das ist wohl der Gedankenfehler...
      out$ + a$ 
  EndIf
Until FindString(out$, "</html>", 0)

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EditorGadget(1,10,10,480,230,0)
  SetGadgetText(1,out$)
  
  SendMessage_(GadgetID(1),#EM_SETSEL,0,-1)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

Re: Abschneiden HTML Header

Beitrag von shadow »

Hi,

also der HTML-Header endet nach RFC mit zwei Zeilenschaltungen. Weiß aber grad nicht, ob es nur CR oder CRLF ist. So müsstest du einfach alles nach den ersten zwei Zeilenschaltungen als content ansehen.
<!DOCTYPE
hört sich für mich nach XML an. Oder wird das mittlerweile direkt im HTML-Code verwendet?
Edit: Dummes Mensch :oops: Jetzt weiß ich wieder was das war ...
Zuletzt geändert von shadow am 09.05.2012 12:49, insgesamt 1-mal geändert.
ThinkPad T61 (in Gedenken) | PureBasic 4.61 B1 (32) | Windows 7 (32SP1) | ArchLinux (32) | Syllable (32)
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Abschneiden HTML Header

Beitrag von kunstlust »

Ich habe mal nachgeschaut die Leerzeile ist CR+LF, leider filter er den Header noch nicht aus:

Code: Alles auswählen

InitNetwork()

id = OpenNetworkConnection("de.selfhtml.org", 80)
SendNetworkString(id, "GET /html/kopfdaten/titel.htm HTTP/1.1" + Chr(10) + "Host: de.selfhtml.org" + Chr(10) +Chr(10) )
Repeat
  If NetworkClientEvent(id) = 2
    a$ = Space(2048)
    ReceiveNetworkData(id, @a$, 2048)
  EndIf
   If  FindString(a$, Chr(13)+Chr(10),0) > 0 
      out$ + a$ 
  EndIf
Until FindString(out$, "</html>", 0)

If OpenWindow(0,0,0,500,250,"GET Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EditorGadget(1,10,10,480,230,0)
  SetGadgetText(1,out$)
  SendMessage_(GadgetID(1),#EM_SETSEL,0,-1)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Dazu habe ich noch eine weitere Frage, welche DatenPufferLänge ist für die GET Anweisung die Richtige? Es geht mir dabei nicht um diese HTML Seite, sonder das Grundprinzip um den Header sauber zu trennen.

Ich danke shadow für seine Hilfe, aber ich würde mich um weitere Tips freuen.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Abschneiden HTML Header

Beitrag von Bisonte »

Was haltest Du von simplem Stringsuchen ?

Code: Alles auswählen

InitNetwork()

id = OpenNetworkConnection("de.selfhtml.org", 80)

If id
  
  SendNetworkString(id, "GET /html/kopfdaten/titel.htm HTTP/1.1" + Chr(10) + "Host: de.selfhtml.org" +#CRLF$ + #CRLF$ )
  
  Found = 0
  
  Repeat
    
    If NetworkClientEvent(id) = 2
      a$ = Space(2048)
      ReceiveNetworkData(id, @a$, 2048)
    EndIf
    
    If FindString(LCase(a$), "<html>", 0) > 0
      Found = 1
    EndIf
    
    If Found = 1
      If Left(LCase(a$),9) = "<!doctype"
        out$ + Mid(a$,FindString(LCase(a$), "<html>", 0))
      Else
        out$ + a$
      EndIf
    EndIf
    
  Until FindString(out$, "</html>", 0)
  
  CloseNetworkConnection(id)
  
EndIf

If OpenWindow(0,0,0,500,250,"GET Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EditorGadget(1,10,10,480,230,0)
  SetGadgetText(1,out$)
  SendMessage_(GadgetID(1),#EM_SETSEL,0,-1)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Abschneiden HTML Header

Beitrag von kunstlust »

Leider ist das noch nicht ganz die Lösung Bisonte. Ich will eine Datei herunterladen und dies noch Beeinflussungen, welcher Browser und so, was ja per get geht. Ich habe das mal vereinfach:

Code: Alles auswählen

InitNetwork()
id = OpenNetworkConnection("www.purebasic.com", 80)
SendNetworkString(id, "GET /images/box.png HTTP/1.1" +  Chr(13) +Chr(10) + "Host: www.purebasic.com" + Chr(13) +Chr(10)+ Chr(13) +Chr(10) )
Repeat
  If NetworkClientEvent(id) = 2
ReceiveNetworkFile(ID, "t:\box.png")
size =  FileSize("t:\box.png") 
Delay(500)
  EndIf
Until  size =  FileSize("t:\box.png")   
CloseNetworkConnection(id)

Die viele CR/LF habe ich mir von der http://en.wikipedia.org/wiki/Hypertext_ ... r_Protocol geholt:
Leider ist ja PNG nicht zu gebrauchen, aber warum?
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Abschneiden HTML Header

Beitrag von kunstlust »

Ist ja auch klar, das die PNG "defekt" ist, weil der Header auch hier drin ist... :praise:

OK
Date: Wed, 09 May 2012 12:44:27 GMT
Server: Apache/2.2.16 (Debian)
Last-Modified: Tue, 29 Dec 2009 23:44:09 GMT
ETag: "342457-2e6d-47be69926e440"
Accept-Ranges: bytes
Content-Length: 11885
Content-Type: image/png

‰PNG


Ist der Header egal was ich herunterlade immer 10 Zeilen lang?
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Abschneiden HTML Header

Beitrag von Bisonte »

Schau dir mal http://purebasic.fr/german/viewtopic.ph ... vehttpfile an....

Dort hat unser CodeCommander ;) etwas gebastelt wo du dir evt. Denkanstösse holen kannst...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

Re: Abschneiden HTML Header

Beitrag von shadow »

kunstlust hat geschrieben:...
Ist der Header egal was ich herunterlade immer 10 Zeilen lang?
Nein, aber der Header wird immer durch die ersten zwei Zeilenschaltungen (je nach System/Server unterschiedlich, ob CR/CRLF/LF) beendet. Danach kommt _definitiv_ der Inhalt.
ThinkPad T61 (in Gedenken) | PureBasic 4.61 B1 (32) | Windows 7 (32SP1) | ArchLinux (32) | Syllable (32)
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Abschneiden HTML Header

Beitrag von kunstlust »

Ich habe mich nun erstmal für URLDownloadToFile_(0,"http://...","C:\...",0,0) entschieden, das ist zwar nur unter Windows zu nutzen, läuft aber besser als das ReceiveHTTPFile, warum verstehe ich auch nicht, liegt sicher an dem tollen Webserver...

Danke für die Hilfe :bounce:
Antworten