String aus HTML Filtern

Für allgemeine Fragen zur Programmierung mit PureBasic.
KingS
Beiträge: 11
Registriert: 04.01.2006 15:12

String aus HTML Filtern

Beitrag von KingS »

Hi, hi.
Also, es handelt sich um folgendes. Ich würde gern die Links aus einem HTML Dokument rausfiltern. Ansich ist das ja auch nix schwieriges, aber was mir Probleme bereitet ist das Filtern. Ich hab bis jetzt das geschrieben:

Code: Alles auswählen

Procedure HTMLTag_Filter(String2Filter.s) 

  laenge.l = Len (String2Filter.s) 
  capture.l= 0
  filtered.s = "" 
  
    For dummy=1 To laenge Step 3
    part.s = Mid(String2Filter.s, dummy, 3) 
    
    If part.s = "<A>" 
      capture.l = 1
    EndIf 
    
    
    If capture.l = 1 
    If part.s = "<A>" Or part.s = "</A"
    Else 
   
    filtered.s = filtered.s + part.s 
    
    EndIf 
    
    
    EndIf 
    
    If capture.l = 1 And part.s = "</A" 
      capture.l = 0 
    EndIf    
    
    Next dummy 


  
  Debug filtered.s ;AUSGABE

EndProcedure 

html.s = "<HTML><HEAD><A>PureBasic</A></HEAD><BODY> Ich sag Hallo !!! </BODY></HTML>" 

HTMLTag_Filter(html.s) 
Das kann man aber nicht grad als gut bezeichnen. Würd jetzt nach PureBasic ein Leerzeichen gemacht werden dann ginge es nicht mehr.
Probier das jetzt seit 2 Std. richtig hinzukriegen, ich verzweifle noch.

Müsste aber sowieso ein bissel anders sein. Da der Link ja nicht zwischen <a> und </a> steht sondern in <a src=" ">

Hoffe jemand hat ne Idee, wie man das lösen könnte.

Mfg KingS :allright:

Edit by NicTheQuick: Quote-Tags durch Code-Tags ersetzt
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Hast du schon mal an Findstring() gedacht,
das dibt dir die Position des gefundenen
Textes zurück.
KingS
Beiträge: 11
Registriert: 04.01.2006 15:12

Beitrag von KingS »

Das war der mir entflohene Befehl, danke :)

Code: Alles auswählen

Procedure HTMLTag_Filter(String2Filter.s) 

  filtered.s = "" 
  part1 = FindString(String2Filter.s, "<a>", 1)
  part2 = FindString(String2Filter.s, "</a>", 1)    
  part1 = part1 + 3
  part2 = part2 - 1
    
For dummy=part1 To part2

     part.s = Mid(String2Filter.s, dummy, 1)   
     filtered.s = filtered.s + part.s 
    
  Next  

  
  Debug filtered.s ;AUSGABE

EndProcedure 

html.s = "<HTML><HEAD><a>PureBasic</a></HEAD><BODY> Ich sag Hallo !!! </BODY></HTML>" 

HTMLTag_Filter(html.s) 
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: String aus HTML Filtern

Beitrag von AND51 »

KingS hat geschrieben:

Code: Alles auswählen

<A>PureBasic</A>
Ist kein gutes Beispiel fürn Links, haste Recht. :allright: Dazu noch
KingS hat geschrieben:Das kann man aber nicht grad als gut bezeichnen

KingS hat geschrieben:Da der Link ja nicht zwischen <a> und </a> steht sondern in <a src=" ">
Auch hierzu sage ich:
KingS hat geschrieben:Das kann man aber nicht grad als gut bezeichnen
Und das Stimmt, ein Link sieht so aus:

Code: Alles auswählen

<a href="http://www.ilovepurebasic.de/">Meine Lieblingsseite</a>
Außerdem, was machst du, wenn nicht nur das Attribut href, sondern auch target oder onMouseover oder viele andere hinzukommen? Und was machst du wenn wie so oft kein Text zwischen <a> und </a> steht sondern ein Bild oder ein anderes Objekt?

Nur son paar Hinweise, die du bedenken kannst / solltest.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
KingS
Beiträge: 11
Registriert: 04.01.2006 15:12

Beitrag von KingS »

Jap, danke für die Hinweise. Sind mir schon klar die Sachen, an denen Arbeite ich momentan.

Bis auf das mit dem href, dass hatte ich verwechselt *g*

Was ich auch noch Bedenken muss ist, dass mehrere Links in einer Zeile stehen können.

Bin momentan soweit. Läuft aber noch nicht ganz rund, momentan hat der noch ein Problem, wenn nur ein Link in einer Zeile ist. Und mehr als 2 kann er auch nicht auslesen :?

Code: Alles auswählen

Procedure HTMLTag_Filter(String2Filter.s) 
part1 = 0
part2 = 0
part3 = 0
part4 = 0




  filtered1.s = "" 
  filtered2.s = "" 
  part1 = FindString(String2Filter.s, "href="+Chr(34), 1)
  part2 = FindString(String2Filter.s, Chr(34), part1+7)
  part1 = part1 + 6
  part2 = part2 - 1
  part3 = FindString(String2Filter.s, "href="+Chr(34), part1+10)
  part4 = FindString(String2Filter.s, Chr(34), part3+7) 
  part3 = part3 + 6
  part4 = part4 - 1

For dummy1=part1 To part2
     part5.s = Mid(String2Filter.s, dummy1, 1)   
     filtered1.s = filtered1.s + part5.s 
Next 

If filtered1.s
Debug filtered1.s ;AUSGABE
EndIf 

For dummy2=part3 To part4
     part6.s = Mid(String2Filter.s, dummy2, 1)   
     filtered2.s = filtered2.s + part6.s 
Next 

If filtered2.s
Debug filtered2.s ;AUSGABE
EndIf



EndProcedure 

  
If ReadFile(0 ,"test2")
Repeat
ZeilenAnzahl = ZeilenAnzahl + 1
Buffer$ = ReadString() 
HTMLTag_Filter(Buffer$) 
Until Eof(0)
CloseFile(0)
EndIf 
Nunja, das werd ich auch noch hinkriegen *g* Ich werde versuchen noch ein kleines Codeschnippselchen zu schreiben, welches zählt, wie oft ein link in einem String vorkommt und dann mach ich das ganze mit ner for Schleife.


Meine Überlegung war es das so auszuzählen:

Code: Alles auswählen

testbuffer = -6
test = -1

Repeat
testbuffer = FindString(String2Filter.s, "href="+Chr(34), testbuffer+6)
test = test + 1
Until testbuffer = 0
Die Until Bedingung muss ich noch überarbeiten. Geht bei mir aber, da ich in der HTML Datei ans Ende in ne neue Zeile href=" " geschrieben hab :)
Zuletzt geändert von KingS am 06.01.2006 19:44, insgesamt 1-mal geändert.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Hilft dir das ?

Code: Alles auswählen

  Procedure Parse(html.s)
    
    c = CountString(html,"<a")
    
    For i = 1 To c
      
      pos  = FindString(html,"href",pos)
      pos  = FindString(html,Chr(34),pos) + 1  
      pos2 = FindString(html,Chr(34),pos) - pos 
      Debug Mid(html,pos,pos2) 
      
      pos   = FindString(html,">",pos) + 1
      pos2  = FindString(html,"<",pos) - pos 
      Debug Mid(html,pos,pos2)
      
    Next 
    
  EndProcedure
  
  str.s ="<a href = "+Chr(34)+"http://www.ilovepurebasic.de/"+Chr(34)+">Meine Lieblingsseite</a>"
  str.s +"<a href="+Chr(34)+"http://www.purebasic.com/"+Chr(34)+">PBSEITE</a>"
  str.s +"<a href = "+Chr(34)+"http://www.ilovepurebasic.de/"+Chr(34)+">Meine Lieblingsseite</a>"
  
  Parse(str)
KingS
Beiträge: 11
Registriert: 04.01.2006 15:12

Beitrag von KingS »

Das ist sehr Klasse @ Hallodri.
Klappt erstens besser als meins und ist viel weniger Source :freak:

Ich geh die Sachen einfach manchmal von viel zu weit außen an :)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Solange es noch ein Stringlimit gibt ist es aber mit Vorsicht zu geniessen.
Html Seiten sind oft groesser als 64k.
KingS
Beiträge: 11
Registriert: 04.01.2006 15:12

Beitrag von KingS »

Mhm, naja, ich mach das ganze mit ner Schleife:

Code: Alles auswählen

If ReadFile(0 ,Datei$)
Repeat
ZeilenAnzahl = ZeilenAnzahl + 1
Buffer$ = ReadString() 
Parse(Buffer$) 
Until Eof(0)
CloseFile(0)
EndIf 
Da sollts doch egal sein, oder? Solang der String wos hinterhergespeichert wird nicht größer als 64 wird.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ihr... Ihr gemeinen Nachmacher! Alloe lieben PureBasic, das ist ja okay. Aber dasss ihr

Code: Alles auswählen

ilovepurebasic
zu eurem Slogan macht... ;-)

Was ich noch sagen wollte ist:
Ws ist, wenn unnötige Leerzeichen zwischen HREF, = und dem darauffolgendem " platziert werden?

Code: Alles auswählen

<a href="variante 1">Test</a>
<a href = "variante 2" > Test </a> 
<a HREF =   "variante 3">Test</a>
<a href="variante 4" target="MeinLieblingsFrame">Test</a>
<a target="MeinLieblingsFrame" href="variante 5">Test</a>
Man schenke auch 4. unf 5. Beachtung!

Da ist die Riehenfloge nämlich vertauscht!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten