Seite 1 von 2

String aus HTML Filtern

Verfasst: 06.01.2006 17:11
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

Verfasst: 06.01.2006 17:27
von Macros
Hast du schon mal an Findstring() gedacht,
das dibt dir die Position des gefundenen
Textes zurück.

Verfasst: 06.01.2006 18:14
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) 

Re: String aus HTML Filtern

Verfasst: 06.01.2006 18:24
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.

Verfasst: 06.01.2006 19:16
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 :)

Verfasst: 06.01.2006 19:42
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)

Verfasst: 06.01.2006 19:50
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 :)

Verfasst: 06.01.2006 20:02
von edel
Solange es noch ein Stringlimit gibt ist es aber mit Vorsicht zu geniessen.
Html Seiten sind oft groesser als 64k.

Verfasst: 06.01.2006 20:14
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.

Verfasst: 06.01.2006 20:44
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!