Avatar billede zimp Nybegynder
16. august 2002 - 10:35 Der er 5 kommentarer

HTML parser der kan give links

Er der nogen der kender en HTML parser der kan give mig alle links/frames (og alt synlig text) fra en HTML klump? Links i en TStringList ville være nice.
Avatar billede hermandsen Juniormester
16. august 2002 - 20:39 #1
Det du har brug for er noget i retning af en IsWebLink-function...

For at få teksten ud af noget HMTL kan du jo bruge den her:
http://www.eksperten.dk/spm/230700

Jeg ser lige om jeg kan fikse noget der finde noget der sorterer links ud af et HTML-dokument! ;)
Avatar billede hermandsen Juniormester
16. august 2002 - 21:55 #2
Jeg skal da aldrig lave en parser!!!

Nå, men selv om det sikkert er ret meget slam-kode, så virker det da... Smæk en TMemo, en TListBox og en TButton ind på din form... Sæt noget HTML-kode ind i Memo'en og fra knappens OnClick-event kalder du så følgende kode:

procedure TForm1.Button1Click(Sender: TObject);

  function GetLinks(S: String; var ReturnStr: TStringList): Boolean;

    function MinNotZero(A, B: Integer): Integer;
    begin
      if (A > B) and (B <> 0) then
        Result := B
      else Result := A;
    end;

  var
    I: Integer;
    S1: String;
  begin
    Result := False;

    I := Pos('<', S);
    while I <> 0 do
    begin
      S := Copy(S, I+1, Length(S));
      S := TrimLeft(S);
      if (S[1] = 'a') or (S[1] = 'A') then
      begin
        I := Pos('href', LowerCase(S));
        if I = 0 then Exit;
        S1 := Copy(S, I+Length('href'), Length(S));
        S1 := TrimLeft(S1);
        S1 := Copy(S1, 2, Length(S1)); //Væk med "="
        S1 := TrimLeft(S1);
        if S1[1] = '"' then
        begin
          Delete(S1, 1, 1);
          S1 := Copy(S1, 0, Pos('"', S1)-1);
        end
        else
       
          S1 := Copy(S1, 0, MinNotZero(Pos(' ', S1), Pos('>', S1))-1);
        ReturnStr.Add(S1);
        S := Copy(S, Pos('>', S)+1, Length(S));
        Result := True;
      end;
      I := Pos('<', S);
    end;
  end;

var
  I: Integer;
  sl: TStringList;
begin
  sl := TStringList.Create;
  ListBox1.Clear;
  for I := 0 to Memo1.Lines.Count -1 do
    GetLinks(Memo1.Lines.Strings[I], sl);
  ListBox1.Items.Assign(sl);
end;

Bemærk lige at jeg bare har skrevet koden uden at optimere ret meget... Jeg haaader at parse!!! :)

Nå, men jeg håber da det kan bruges!

//hermandsen
Avatar billede cms Nybegynder
17. august 2002 - 15:41 #3
?! Jeg elsker at parse!
Avatar billede zimp Nybegynder
19. august 2002 - 10:59 #4
Tak for kommentarerne, men jeg har faktisk allerede lavet det selv. Problemet er at jeg ikke kan være 200% sikker på at jeg har taget højde for alle tænkelige måder links/frames kan stå i HTML, derfor ville jeg gerne have en komponent som er brugt af andre, og derfor testet mere end jeg kan teste min egen kode.
Avatar billede hermandsen Juniormester
22. januar 2003 - 18:50 #5
Lukketid?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester