Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Alle Image-Links aus HTML-String extrahieren (schnell)? (https://www.delphipraxis.net/184662-alle-image-links-aus-html-string-extrahieren-schnell.html)

PeterPanino 13. Apr 2015 00:01

Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Hallo! Was ist die SCHNELLSTE Möglichkeit, um aus einem HTML-Dokument alle Image-Links zu extrahieren? Dabei sollten automatisch auch relative Links verabsolutiert und andere Winkelzüge umschifft werden.

himitsu 13. Apr 2015 00:10

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Ein HTML-Parser, der die Syntax komplett kennt.
Und dann natürlich noch JavaScript ausführen/analysieren.

Oder man geht den legalen Weg und sucht sich eine ensprechende Schnittstelle zu den gwünschten Daten.

PeterPanino 13. Apr 2015 00:28

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Mhm, kannst du mir bitte erklären, was du damit meinst? Danke.

Popov 13. Apr 2015 01:10

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Hm, ich kenne eine Möglichkeit, sie ist auch schnell, glaube ich, aber definitiv nicht die Schnellste. Somit fühle ich mich nicht angesprochen. Ich gehe nun schlafen.

PeterPanino 13. Apr 2015 07:56

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Ich glaube, manchmal sind die einfachsten Lösungen oft die besten. Ich entferne einfach alle Zeilenumbrüche und wende dann einen regulären Ausdruck an, um alle Image-Links zu finden:

Delphi-Quellcode:
function RemoveChars(const S, Chars: string): string; // Chars CaseSensitive;
// http://www.delphipraxis.net/184473-schnellstes-entfernen-von-chars-aus-einem-string-4.html
var
  I, Index: integer;
  Skip: array [Char] of boolean;
begin
  FillChar(Skip[#0], Length(Skip) * SizeOf(Skip[#0]), 0);
  for I := 1 to Length(Chars) do
    Skip[Chars[I]] := true;
  SetLength(Result, Length(S));
  index := 0;
  for I := 1 to Length(S) do
    if not Skip[S[I]] then
    begin
      Inc(index);
      Result[index] := S[I];
    end;
  SetLength(Result, index);
end;

procedure TForm1.btnTestClick(Sender: TObject);
var
  S, L: string;
  ThisImageLinksRegexObj: TRegEx;
  AllImageLinks: TMatchCollection;
  I: integer;
begin
  S := TFile.ReadAllText('R:\Clipboard Text.txt');
  S := RemoveChars(S, #10#13);

  ThisImageLinksRegexObj :=
    TRegEx.Create('https?://\S+\.(png|jpg|gif|bmp|jpeg|jpe|jp2|tiff|tif)',
    [roIgnoreCase]);
  AllImageLinks := ThisImageLinksRegexObj.Matches(S);

  if AllImageLinks.Count > 0 then
  begin
    for I := 0 to AllImageLinks.Count - 1 do
    begin
      L := AllImageLinks[I].Value;
      CodeSite.Send('AllImageLinks[i]', L);
    end;
  end
  else
  begin
    CodeSite.Send('Keine Image-Links gefunden');
  end;
end;

mkinzler 13. Apr 2015 08:13

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Das findet aber nur absolute Links

uligerhardt 13. Apr 2015 08:16

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Zitat:

Zitat von PeterPanino (Beitrag 1297405)
Ich glaube, manchmal sind die einfachsten Lösungen oft die besten. Ich entferne einfach alle Zeilenumbrüche und wende dann einen regulären Ausdruck an, um alle Image-Links zu finden:

http://stackoverflow.com/a/1732454/1431618

PeterPanino 13. Apr 2015 08:20

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Zitat:

Zitat von mkinzler (Beitrag 1297410)
Das findet aber nur absolute Links

Ja, du hast recht.

Sir Rufo 13. Apr 2015 08:20

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Zitat:

Zitat von mkinzler (Beitrag 1297410)
Das findet aber nur absolute Links

Damit werden auch keine Image-Links gefunden sondern nur Text-Stellen die dem Muster entsprechen. Und das ist etwas völlig anderes.

Darum ist eine RegEx-Suche für so ein Anliegen einfach das falsche Werkzeug oder die Aufgabenstellung ist eine völlig andere.

PeterPanino 13. Apr 2015 08:40

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Nun gut, Regex ist das falsche Werkzeug, ihr habt mich überzeugt.

Aber bitte, wo gibt es einen HTML-Parser, der das kann? Ich habe bei Google gesucht, aber nichts gefunden.

DeddyH 13. Apr 2015 08:48

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Der hier z.B. soll es laut Autor wohl können. Evtl. auch interessant: http://sourceforge.net/projects/htmlp/. Und das sind nur 2 der ersten Treffer, die ich unter Bei Google suchendelphi html parser gefunden habe.

PeterPanino 13. Apr 2015 15:23

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
DIHTMLParser ist für meinen Zweck zwar ein überdimensioniertes Monster, aber es löst relative Links mit Hilfe seines Links-Plugins auf.

milos 13. Apr 2015 23:15

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Schade, dass ich den Thread erst jetzt gesehen habe. Ich schreibe morgen mal nen kleinen Parser - hab in letzter Zeit ziemlich oft damit zu tun, ist ein spannendes Gebiet :)

milos 14. Apr 2015 00:27

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ok, konnte es doch nicht sein lassen und habs schon jetzt gemacht ^^
Bild und Projekt ist angehängt, und die Parszeit ist minimal (0.001s - zusehen im Titel vom Fenster)

Hier die Klasse:
Delphi-Quellcode:
unit ImgPathParser;

interface

uses
  Classes, SysUtils;

type
  TImgPathParser = class
  private
    function FGetImgPath(Index : integer) : string;
    function FGetCount : integer;
  public
    ImgPaths : TStringList;
    procedure Parse(AHTML : string);
    property Count : Integer read FGetCount;
    property ImgPath[Index : integer] : string Read FGetImgPath;
  end;

var
  RealativeLink : string = 'http://www.delphipraxis.net/'; // Um einen Relativen Link generieren zu können.

implementation

{ TImagPathParser }

function TImgPathParser.FGetCount: integer;
begin
  Result := ImgPaths.Count;
end;

function TImgPathParser.FGetImgPath(Index: integer): string;
begin
  Result := ImgPaths[Index];
end;

procedure TImgPathParser.Parse(AHTML: string);
var
  CurrentCharIndex: Integer;
  CurrentChar : Char;
  InString : Boolean;
  Buffer : string;
  Extension : string;
begin
  Buffer := '';
  InString := false;
  ImgPaths := TStringList.Create;

  for CurrentCharIndex := 1 to Length(AHTML) do
  begin
    CurrentChar := AHTML[CurrentCharIndex];

    if (not InString) and
       (CurrentChar = '"') then
    begin
      InString := true;
      Continue;
    end;

    if InString then
    begin
      if CurrentChar = '"' then
      begin
        Extension := LowerCase(Copy(Buffer, Length(Buffer)-2,3));

        // !!! EXTENSIONS !!!
        if (Extension = 'png') or
           (Extension = 'gif') or
           (Extension = 'jpg') or
           (LowerCase(Copy(Buffer, Length(Buffer)-3,4)) = 'jpeg') then
        begin
          if Copy(Buffer, 0, 7) <> 'http://' then
            Buffer := RealativeLink + Buffer;
       
          ImgPaths.Add(Buffer);
        end;

        InString := false;
        Buffer := '';

        Continue;
      end;

      Buffer := Buffer + CurrentChar;
    end;

  end;
end;

end.
Benutzen kannst du sie so:
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  StartTime : TDateTime;
begin
  StartTime := Now;

  ImgPaths.Parse(mmo1.Text);

  Text := FloatToStr(MilliSecondsBetween(Now,StartTime) / 1000) + 's';
end;
Hoffe, das ist in etwa so wie du es brauchst :)

Freundliche Grüsse

Dejan Vu 14. Apr 2015 06:06

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Das ist kein Parser. Das ist ein "irgendwas-mit-http-vorne-und-jpg-gif-tif-jpeg-hinten-string-extrakt-o-mat'. Der Schleife ist es vollkommen egal, wo sich dieser String befindet.

Allerdings dürfte das trotzdem für die weitaus meisten Anwendungsfälle reichen. Zuverlässig ist das aber nicht.

PeterPanino 14. Apr 2015 08:11

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Vielen Dank an Milos für seine Idee.

Ein anderer Ansatz: Web-Browser sind doch die besten HTML-Parser, die man sich vorstellen kann. Ist es nicht möglich, die Parsing-Engine eines Web-Browsers für einen beliebigen speziellen Zweck einzusetzen? Gibt es dafür ein Interface?

Sir Rufo 14. Apr 2015 08:18

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Zitat:

Zitat von PeterPanino (Beitrag 1297599)
Vielen Dank an Milos für seine Idee.

Ein anderer Ansatz: Web-Browser sind doch die besten HTML-Parser, die man sich vorstellen kann. Ist es nicht möglich, die Parsing-Engine eines Web-Browsers für einen beliebigen speziellen Zweck einzusetzen? Gibt es dafür ein Interface?

Ja
Bei Google suchenIHTMLDocument oder Hier im Forum suchenIHTMLDocument
oder die neuere Variante
Hier im Forum suchenIHTMLDocument2

Allerdings ist das nicht wirklich das Schnellste, aber das Zuverlässigste. Evtl. solltest du die Fragen demnächst anders stellen ;)

Eine generelle Regel der Programmierung besagt
Zitat:

  1. Make it work
  2. Make it fast


himitsu 14. Apr 2015 08:34

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Nee, das Schnellste und auch das Zuverlässigste hatte ich bereits in #2 genannt (siehe Oder), aber da hört ja niemals jemand drauf.

Sir Rufo 14. Apr 2015 08:57

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Zitat:

Zitat von himitsu (Beitrag 1297603)
Nee, das Schnellste und auch das Zuverlässigste hatte ich bereits in #2 genannt (siehe Oder), aber da hört ja niemals jemand drauf.

Selber schuld, du (er)hörst ja auch seine Frage nicht ;)
Zitat:

Zitat von himitsu (Beitrag 1297385)
Ein HTML-Parser, der die Syntax komplett kennt.
Und dann natürlich noch JavaScript ausführen/analysieren.

Oder man geht den legalen Weg und sucht sich eine ensprechende Schnittstelle zu den gwünschten Daten.

Zitat:

Zitat von PeterPanino (Beitrag 1297386)
Mhm, kannst du mir bitte erklären, was du damit meinst? Danke.


himitsu 14. Apr 2015 09:56

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Diese Frage wurde doch von den Anderen schon beantwortet. :stupid:

PeterPanino 14. Apr 2015 10:53

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1297601)
Eine generelle Regel der Programmierung besagt
Zitat:

  1. Make it work
  2. Make it fast


Regeln sind wichtig - kein Spiel kommt ohne Regeln aus. Hier ist ein exzellentes Buch, in dem weitere Programmier-Grundsätze zu finden sind:

Zitat:

Weniger schlecht programmieren
By Kathrin Passig, Johannes Jander

"Ein Experte ist jemand, der auf einem Spezialgebiet alle denkbaren Fehler bereits gemacht hat." Niels Bohr, Nobelpreisträger für Physik

Kathrin Passig gilt als Meisterin des unorthodoxen Blickwinkels, und wenn sie sich zusammentut mit einem gestandenen Entwickler, um ein Programmierbuch zu schreiben, darf man gespannt sein! Mit Sachverstand und Witz widmen sich die beiden den Holzwegen, Fehleinschätzungen und Irrtümern, die gerade Programmier-Neulingen und Hobby-Entwicklern häufig das Leben schwer machen. Ein Lesevergnügen für alle, die ahnen, dass in ihnen ein besserer Programmierer steckt.
http://www.oreilly.de/catalog/wenschleprogger/


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz