Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Gewisse Zeile mit bestimmtem Wort aus Memo (html) auslesen (https://www.delphipraxis.net/107750-gewisse-zeile-mit-bestimmtem-wort-aus-memo-html-auslesen.html)

Maxisoft2 1. Feb 2008 15:53


Gewisse Zeile mit bestimmtem Wort aus Memo (html) auslesen
 
Liebe Delphianer,

Ich stehe mal wieder vor einem Problem -
Ich muss für ein Forum ein Programm schreiben, dass den HTML Quelltext einer gewissen
Seite ausliest, und mir dann im Quelltext immer nur die folgenden Textstücke:
<A href="profile.php?ids=verschiedenezahlen">
rauskopiert und in einer .txt speichert.

Soweit sogut - momentan lese ich so den Quelltext der Seite aus und trage ihn in ein
Memo ein:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  vTemp : variant;
begin
  vTemp := WebBrowser1.Document;
  if Webbrowser1.LocationURL <> '' then
    Memo1.Text := vTemp.Body.OuterHTML
  else
    ShowMessage('Seite nicht vorhanden!');
end;
Wie bringe ich es nun zum Stande, dass Delphi auf einen Knopfdruck exakt diese Zeilen mit profile.php?
in ein weiteres Memo oder in eine Textdatei kopiert?


In der Hoffnung, dass die Frage nicht zu banal aber dennoch lösbar ist,
- M. S.

shmia 1. Feb 2008 16:05

Re: Gewisse Zeile mit bestimmtem Wort aus Memo (html) ausles
 
mit folgendem Code ist das leicht möglich:
Delphi-Quellcode:
type
   TOnExtractLink = procedure(const URL:string) of object;
// Extract all Links from Document
procedure ExtractDocumentLinks(Document: IDispatch; callback:TOnExtractLink);
// Extract all Links from Browser's Document
procedure ExtractWBLinks(WebBrowser: TWebBrowser; callback:TOnExtractLink);

...

procedure ExtractDocumentLinks(Document: IDispatch; callback:TOnExtractLink);
var
   doc, links, link : OleVariant;
   i : Integer;
begin
   doc := Document;

   links := doc.links;

   for i:=0 to links.Length-1 do
   begin
      link := links.item(i);
      callback(link.HREF);
   end;
end;

procedure ExtractWBLinks(WebBrowser: TWebBrowser; callback:TOnExtractLink);
begin
   if not Assigned(WebBrowser.Document) then
      Exit;
   ExtractDocumentLinks(WebBrowser.Document, callback);
end;
Du rufst die Procedure ExtractWBLinks() auf und musst allerdings eine Calback-Methode angeben:

Delphi-Quellcode:
  ...
  ExtractWBLinks(WebBrowser1, AddToList);
  ...

procedure TForm1.AddToList(const URL:string);
begin
  // hier wäre Gelegenheit, unerwünschte oder doppelte URL auszufiltern
 
  if copy(URL, 1, 5) = 'http:' then
     Memo1.Lines.Add(URL) // hier alle http: URL rein
  else
     Memo2.Lines.Add(URL); // und hier den Rest (ftp:, mailto: ,...)
end;

Maxisoft2 1. Feb 2008 17:10

Re: Gewisse Zeile mit bestimmtem Wort aus Memo (html) ausles
 
Hammer !
Vielen Dank für die schnelle Hilfe, versuche es gleich mal!

Maxisoft2 2. Feb 2008 20:24

Re: Gewisse Zeile mit bestimmtem Wort aus Memo (html) ausles
 
Hallo nochmal!

Ich scheine irgendwie zu blöd dafür zu sein, das Script zum Laufen zu bringen.
Mir fehlt für addtolist wohl irgend eine Typendeklaration, aber ich komme nicht
drauf, wie ich AddToList deklarieren soll und ob überhaupt !?

So schaut mein Quelltext momentan aus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw;

type

  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
   private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
   TOnExtractLink = procedure(const URL:string) of object;
// Extract all Links from Document
procedure ExtractDocumentLinks(Document: IDispatch; callback:TOnExtractLink);
// Extract all Links from Browser's Document
procedure ExtractWBLinks(WebBrowser: TWebBrowser; callback:TOnExtractLink);


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ExtractDocumentLinks(Document: IDispatch; callback:TOnExtractLink);
var
   doc, links, link : OleVariant;
   i : Integer;
begin
   doc := Document;

   links := doc.links;

   for i:=0 to links.Length-1 do
   begin
      link := links.item(i);
      callback(link.HREF);
   end;
end;

procedure ExtractWBLinks(WebBrowser: TWebBrowser; callback:TOnExtractLink);
begin
   if not Assigned(WebBrowser.Document) then
      Exit;
   ExtractDocumentLinks(WebBrowser.Document, callback);
end;

procedure TForm1.AddToList(const URL:string);
begin
  // hier wäre Gelegenheit, unerwünschte oder doppelte URL auszufiltern
 
  if copy(URL, 1, 5) = 'http:' then
     Memo1.Lines.Add(URL) // hier alle http: URL rein
  else
     Memo2.Lines.Add(URL); // und hier den Rest (ftp:, mailto: ,...)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.webseite.de');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ExtractWBLinks(WebBrowser1, AddToList);
end;

end.
Einzigste Fehlermeldung die ich bekomme ist: "Undefinierter Bezeichner: 'AddToList'",
was ja nun auch logisch ist, da ich es ja nicht deklariert habe, oder habe ich irgend
etwas anderes falsch verstanden?

(Tut mir leid, bin noch am Lernen ;-). Und habe nun echt lange versucht es selbst zu lösen,
aber komme einfach nicht drauf *verzweifel*)

Grüße,
- M. S.

marabu 2. Feb 2008 20:32

Re: Gewisse Zeile mit bestimmtem Wort aus Memo (html) ausles
 
Hallo,

versuche es mal so:

Delphi-Quellcode:
// ...
  private
    { Private-Deklarationen }
    procedure AddToList(const URL:string);
// ...
Gute Nacht

Maxisoft2 2. Feb 2008 20:39

Re: Gewisse Zeile mit bestimmtem Wort aus Memo (html) ausles
 
Nabend nochmal,

Der oberhammer! Alles funktioniert - und ich habe wieder mal dazugelernt :-) Super!
Danke Dir für den schnellen Späteinsatz,

Gute Nacht,
- M.S.

Maxisoft2 2. Feb 2008 21:37

Re: Gewisse Zeile mit bestimmtem Wort aus Memo (html) ausles
 
Hallo -

Ich fürchte, ich habe doch noch eine Frage.

Mit dem jetzigen Script füge ich alle Html-Links dem Memo hinzu.
Kann ich irgendwie schaffen, nur Links in diesem Format ins Memo
zu kopieren?
http://www.webseite.de/profile.php?ids=variierendezahl

Ich habe mir den Post mit dem Leerzeilen löschen angesehen, und dachte mir,
ich könnte vielleicht alles "aussen um die gewollten Links" löschen (also
alle anderen Links) funktioniert aber auch nicht.

Mein Erster versuch war natürlich in dieser Zeile:
Delphi-Quellcode:
  if copy(URL, 1, 5) = 'http://www.webseite.de/profile.php?ids=*' then
     Memo1.Lines.Add(URL) // hier alle http: URL rein
Einfach den Anfang der Zeile mit einem * anzugeben, funktioniert leider nicht.
(So landen alle Links in Memo 2)
Wahrscheinlich ist mein Annährungsversuch nicht ganz so richtig,
ich würde mich riesig über weitere Hilfe freuen!

Lässt sich vielleicht einfach im jetzigen Quelltext festlegen, dass
nur die gewollten Urls in das Memo kopiert werden?

Grüße,
- M.S.

EDIT:

Habe es nun mit einem StringReplace gelöst, indem ich alle mir bekannten, nicht gewollten urls lösche.
Klappt soweit. Über elegantere Lösungen bin ich natürlich happy :-)

marabu 3. Feb 2008 07:01

Re: Gewisse Zeile mit bestimmtem Wort aus Memo (html) ausles
 
Moin,

du könntest die Prozedur AddList so umbauen:

Delphi-Quellcode:
uses
  StrUtils; // AnsiStartsText, RightStr

procedure TForm1.AddToList(const URL:string);
const
  PFX = 'http://www.webseite.de/profile.php?';
begin
  if AnsiStartsText(PFX, URL)
    then Memo1.Lines.Add(RightStr(URL, Length(URL) - Length(PFX)))
    else Memo2.Lines.Add(URL);
end;
Das hätte den Vorteil, dass du auf die variierenden Zahlen mit Memo1.Lines.ValueFromIndex[i] zugreifen kannst.

Freundliche Grüße

Maxisoft2 3. Feb 2008 11:32

Re: Gewisse Zeile mit bestimmtem Wort aus Memo (html) ausles
 
Hallo!

Super Sache!
Vorallem genial, dass ich so die Ids einzeln bekomme!
Der Oberwahnsinn!

Hab' tausend Dank,
- M. S.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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