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.
|
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. |
AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
Mhm, kannst du mir bitte erklären, was du damit meinst? Danke.
|
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.
|
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; |
AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
Das findet aber nur absolute Links
|
AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
Zitat:
|
AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
Zitat:
|
AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
Zitat:
Darum ist eine RegEx-Suche für so ein Anliegen einfach das falsche Werkzeug oder die Aufgabenstellung ist eine völlig andere. |
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. |
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 delphi html parser gefunden habe.
|
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.
|
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 :)
|
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:
Benutzen kannst du sie so:
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.
Delphi-Quellcode:
Hoffe, das ist in etwa so wie du es brauchst :)
procedure TForm1.btn1Click(Sender: TObject);
var StartTime : TDateTime; begin StartTime := Now; ImgPaths.Parse(mmo1.Text); Text := FloatToStr(MilliSecondsBetween(Now,StartTime) / 1000) + 's'; end; Freundliche Grüsse |
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. |
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? |
AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
Zitat:
IHTMLDocument oder IHTMLDocument oder die neuere Variante IHTMLDocument2 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:
|
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.
|
AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
Zitat:
Zitat:
Zitat:
|
AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
Diese Frage wurde doch von den Anderen schon beantwortet. :stupid:
|
AW: Alle Image-Links aus HTML-String extrahieren (schnell)?
Zitat:
Zitat:
|
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