Entwickler-Ecke
Sonstiges (Delphi) - links aus datei extrahieren
webrage - Do 29.08.02 03:15
Titel: links aus datei extrahieren
hallo alle zusammen...
folgendes problem:
ich hab einen kompletten seitenquelltext der enthält z.b. 3 links...
ich will diese 3 links aus dem gesamten quelltext extrahieren
mit pos geht nich weil pos immer nur das erste vorkommen anzeigt.
eine schleife zu fahren und nach <a href=" zu suchen geht nich so wie ich es bisher probiert hab...
ich muss also aus einem string alle vorkommenden urls zwischen
allen <a href=" und dem folgenden " extrahieren....
kann mir bitte jemand auf die sprünge helfen ?
DeCodeGuru - Do 29.08.02 08:16
folgenden code, habe ich mal in einem programm verwendet. Des programm ist allerdings schon recht alt und dementsprechend ist der code auf etwas "ungekürzt" und nicht sonderlich gut. Aber er funktioniert :mrgreen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| procedure TForm1.SearchFiles; var i,k,l: Integer; tmp, url, test: String; fertig,ende: Boolean; tmpfile,temp: TStringlist; begin try filesuf := TStringlist.Create; temp := TStringList.Create; tmpfile := TStringlist.Create; tmpfile.LoadFromFile('tmp.html'); if usercancel = false then begin for i := 1 to Length(tmpfile.Text) do begin if usercancel = false then begin Application.ProcessMessages; tmp := Copy(tmpfile.Text,i,5); tmp := LowerCase(tmp); if tmp = 'href=' then begin temp.Add(IntToStr(i)); end; end else begin exit; end; end;
//Jetzt werden die Links rausgesucht
for i := 0 to temp.Count -1 do begin if usercancel = False then begin url := ''; fertig := false; ende := false; k := StrToInt(temp[i]); for l := k + 6 to Length(tmpfile.Text) do begin test := Copy(tmpfile.Text,l,1); if (test <> '"') and (fertig = false) and (ende = false) then begin url := url + test; end; if (test = '"') and (fertig = false) and (ende = false) then begin fertig := True; ende := True; end; if (fertig = True) and (ende = True) then begin filesuf.Add(url); break; end; end; end else begin exit; end; end; Memo1.Lines.Add('Es wurden '+IntToStr(filesuf.count)+' Dateien gefunden...'); end else begin exit; end; finally temp.Free; tmpfile.Free; ExtensionTest; Application.ProcessMessages; end; end; |
Natürlich musst du den Code weiterverarbeiten und sämtliche sachen rauskürzen. Achja, wer sich wundert, warum am ende der Datei ein Aufruf der Prozedur Extensiontest steht, dem sei gesagt, dass das programm eigentlich dafür war, alle links aus einer HTML-seite mit einer bestimmten extension herunterzuladen.
naja, ich hoffe dir hilft der code. :wink:
webrage - Do 29.08.02 20:05
Titel: problem
ich drehe hier bald durch, ich habs folgendemassen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TForm1.startClick(Sender: TObject); var source,S :string; cnt, i :integer; begin start.enabled:=false; HTMLParser1.Html.Clear; lb.Clear; NMHTTP1.Get(surl.Text); source:= lowercase(NMHTTP1.Body); lb.Items.Add(source); HTMLParser1.html.Add(source); HTMLParser1.Execute; lb.Items.Assign(HTMLparser1.Parsed.Hyperlinks);
cnt:=lb.Items.Count; I:=0; with lb do begin while i < cnt do begin S := Items[i]; Inc(i); while (i < cnt) and (Items[i] = S) do begin Items.Delete(i); Dec(cnt); end; end; end;
status.Text:=('Es wurden '+inttostr(lb.Items.Count)+' Links eingelesen.'); anz.Caption:='Gesammelte Links: '+inttostr(lb.Items.Count); start.enabled:=true; end; |
Das Problem ist das die doppelten Einträge nicht korrekt gefiltert werden.
Wenn ich aber den Teil zum Filtern:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| cnt:=lb.Items.Count; i:=0; with lb do begin while i < cnt do begin S := Items[i]; Inc(i); while (i < cnt) and (Items[i] = S) do begin Items.Delete(i); Dec(cnt); end; end; end; |
hinter einen extra button lege funktioniert es einwandfrei, das bedeutet wenn ich es in einer Prozedur nachheinander machen lasse gehts nich und wenn ich es auf Knopfdruck mache gehts ?!?
Hat einer Idee was das sein könnte ?
webrage - Do 29.08.02 20:08
Titel: habe gearde
festgestellt das wenn ich den oberen teil wie folgt ändere die Filterung funzt:
Quelltext
1: 2: 3: 4: 5:
| HTMLParser1.html.Add(source); HTMLParser1.Execute; lb.Clear; lb.Sorted:=true; lb.Items.Assign(HTMLparser1.Parsed.Hyperlinks); |
hat einer ne erklärung ?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!