Delphi HTML Datei herunterladen

04/02/2015 23:21 SwagBack#1
Jo Leute !

Ich bin noch ein noob in Delphi und wollte fragen ob man sich irgendwie eine HTML Datei (inklusive Bilder) aus dem Netz saugen kann (z.B. Ein Online Magazin)

Als anfänger habe ich noch nicht soviel erfahrung also währen tutorials am besten :)

(Die html datei soll nach einem Buttoklick heruntergeladen werden und eine variable für den namen die url und das Archiv hab ich schon)

Gruß Sw$G
04/02/2015 23:51 warfley#2
Naja so einfach wird das nicht, du musst zunächst mal den HTML Text runterladen, dafür eignet sich am besten [Only registered and activated users can see links. Click Here To Register...] mit der TIdHttp Klasse.

Danach musst du die HTML Datei parsen und alle Bild URLs kopieren runterladen (wieder tidhttp), und dann die lokalen Pfade ersetzen.
04/03/2015 15:17 SwagBack#3
Quote:
Originally Posted by warfley View Post
Naja so einfach wird das nicht, du musst zunächst mal den HTML Text runterladen, dafür eignet sich am besten [Only registered and activated users can see links. Click Here To Register...] mit der TIdHttp Klasse.

Danach musst du die HTML Datei parsen und alle Bild URLs kopieren runterladen (wieder tidhttp), und dann die lokalen Pfade ersetzen.
Hab das jetzt mir INDY Komponente geschafft jedoch komme ich beim parsen nicht weiter haste ein tut oder code beispiel für mich :) ?

Gruß
04/03/2015 18:46 warfley#4
hier ist mal ein kleines Beispiel:
Code:
procedure TForm1.Button1Click(Sender: TObject);

  procedure CheckCSS(CSS: string; lst: TStringList);
  begin
    //Parse CSS here
  end;

  procedure CheckForLocalFiles(tag: PHtmlTag; lst: TStringList);
  var
    i: integer;
  begin
    if Assigned(lst) then
    begin
      if tag^.TagType = 'style' then
        CheckCSS(tag^.Content, lst)
      else if tag^.TagType = 'link' then
      begin
        for i := 0 to tag^.Propertys.Count - 1 do
        begin
          if PTagProperty(tag^.Propertys[i])^.Name = 'href' then
            if AnsiEndsText('.css', PTagProperty(tag^.Propertys[i])^.Value) then
            begin
              lst.Add(PTagProperty(tag^.Propertys[i])^.Value);
            end;
        end;
      end
      else
      begin
        for i := 0 to tag^.Propertys.Count - 1 do
        begin
          if PTagProperty(tag^.Propertys[i])^.Name = 'style' then
            CheckCSS(PTagProperty(tag^.Propertys[i])^.Value, lst)
          else if PTagProperty(tag^.Propertys[i])^.Name = 'src' then
            lst.Add(PTagProperty(tag^.Propertys[i])^.Value);
        end;
      end;
      for i := 0 to tag^.SubTags.Count - 1 do
        CheckForLocalFiles(PHtmlTag(tag^.SubTags[i]), lst);
    end;
  end;

var
  DL_Links: TStringList;
  Htm: THtmlFile;
  htmText: string;
  i: integer;
begin
  DL_Links := TStringList.Create;
  try
    htmText := IdHTTP1.Get('Link');
    Htm := THtmlFile.Create;
    try
      Htm.LoadHtmlFromString(htmText);
      CheckForLocalFiles(Htm.Tags, DL_Links);
      // Hier Dateien runterladen und ggf seperat parsen (css dateien)

      for i:=0 to DL_Links.Count-1 do
      begin
        htmText:=StringReplace(htmText, DL_Links[i], 'Neuer Local File', [rfIgnoreCase, rfReplaceAll]);
      end;
    finally
      Htm.Free;
    end;
  finally
    DL_Links.Free;
  end;
end;
mit einem kleinen Html Parser den ich mal geschrieben hatte:


Ist aber Free Pascal, kann sein dass du für Delphi ein Paar Änderungen vornehmen musst
04/03/2015 19:44 SwagBack#5
Quote:
Originally Posted by warfley View Post
hier ist mal ein kleines Beispiel:
Code:
procedure TForm1.Button1Click(Sender: TObject);

  procedure CheckCSS(CSS: string; lst: TStringList);
  begin
    //Parse CSS here
  end;

  procedure CheckForLocalFiles(tag: PHtmlTag; lst: TStringList);
  var
    i: integer;
  begin
    if Assigned(lst) then
    begin
      if tag^.TagType = 'style' then
        CheckCSS(tag^.Content, lst)
      else if tag^.TagType = 'link' then
      begin
        for i := 0 to tag^.Propertys.Count - 1 do
        begin
          if PTagProperty(tag^.Propertys[i])^.Name = 'href' then
            if AnsiEndsText('.css', PTagProperty(tag^.Propertys[i])^.Value) then
            begin
              lst.Add(PTagProperty(tag^.Propertys[i])^.Value);
            end;
        end;
      end
      else
      begin
        for i := 0 to tag^.Propertys.Count - 1 do
        begin
          if PTagProperty(tag^.Propertys[i])^.Name = 'style' then
            CheckCSS(PTagProperty(tag^.Propertys[i])^.Value, lst)
          else if PTagProperty(tag^.Propertys[i])^.Name = 'src' then
            lst.Add(PTagProperty(tag^.Propertys[i])^.Value);
        end;
      end;
      for i := 0 to tag^.SubTags.Count - 1 do
        CheckForLocalFiles(PHtmlTag(tag^.SubTags[i]), lst);
    end;
  end;

var
  DL_Links: TStringList;
  Htm: THtmlFile;
  htmText: string;
  i: integer;
begin
  DL_Links := TStringList.Create;
  try
    htmText := IdHTTP1.Get('Link');
    Htm := THtmlFile.Create;
    try
      Htm.LoadHtmlFromString(htmText);
      CheckForLocalFiles(Htm.Tags, DL_Links);
      // Hier Dateien runterladen und ggf seperat parsen (css dateien)

      for i:=0 to DL_Links.Count-1 do
      begin
        htmText:=StringReplace(htmText, DL_Links[i], 'Neuer Local File', [rfIgnoreCase, rfReplaceAll]);
      end;
    finally
      Htm.Free;
    end;
  finally
    DL_Links.Free;
  end;
end;
mit einem kleinen Html Parser den ich mal geschrieben hatte:


Ist aber Free Pascal, kann sein dass du für Delphi ein Paar Änderungen vornehmen musst
danke vielmals :)