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 ?


Arakis - Do 29.08.02 07:36

Hi webrange user defined image,

ich kenn da eine Komponente, die solche Aufgaben sehr zuverlässig und einfach erledigt. Findest du hier [http://homepages.borland.com/torry/vcl/internet/html/jshtmpsr.zip] :P

Bis dann
user defined image


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 ?