Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Website durchsuchen (https://www.delphipraxis.net/98333-website-durchsuchen.html)

Mark90 25. Aug 2007 11:07


Website durchsuchen
 
HI leute,

ich hab mal schon wieder eine Frage. Gibt es eine Möglichkeit eine Website (mit z.b. Indy) nach bestimmten dateien zu durchsuchen?

z.b. nach *.txt dokumenten oder *.html dokumenten

Klaus01 25. Aug 2007 11:23

Re: Website durchsuchen
 
Hallo,

nun, indy durchscuth nicht die html Dateien.
Mit idhttp kannst zu z.B. das html Document in eine Stringlist oder einen Stream
laden.
Die StringList oder den Stream mußt Du dann selber nach dem was Du finden willst durchsuchen.

Grüße
Klaus

Mark90 25. Aug 2007 11:32

Re: Website durchsuchen
 
@klaus1 Ich möchte eigentlich nicht das html dokument durchsuchen sondern die komplette website auf dateien, die man auf der SEite runterladen kann!

aber oK

Klaus01 25. Aug 2007 11:40

Re: Website durchsuchen
 
Zitat:

Zitat von Mark90
@klaus1 Ich möchte eigentlich nicht das html dokument durchsuchen sondern die komplette website auf dateien, die man auf der SEite runterladen kann!

aber oK

Aha, und wo ist der Unterschied zwischen eine WebSeite und html Documenten.
Eine Webseite besteht aus verlinkten html Seiten.
Eine Webseite wie Du sie siehst wird im Webbrowser visualisiert Grundlage ist das html Document.

Grüße
Klaus

Mark90 25. Aug 2007 11:50

Re: Website durchsuchen
 
Imprinzip schon! Wenn du suchen würdest würdest du das Html dokument auf z.b. datei.txt durchsuchen und da wo es vorkommt den pfad extrahieren und downloaden. Habe ich das richtig interpretiert?

Klaus01 25. Aug 2007 11:57

Re: Website durchsuchen
 
Zitat:

Zitat von Mark90
Imprinzip schon! Wenn du suchen würdest würdest du das Html dokument auf z.b. datei.txt durchsuchen und da wo es vorkommt den pfad extrahieren und downloaden. Habe ich das richtig interpretiert?

Ja, denn das HTML Dokument ist auch mehr oder wenger eine TextDatei mit bestimmten formatierungen.
Grüße
Klaus

marabu 25. Aug 2007 12:13

Re: Website durchsuchen
 
Hallo,

Kernstück eines WebSpiders ist eine Funktion, welche die auf einer HTML-Seite vorhandenen Links ermittelt und dann die entsprechenden Seiten rekursiv aufsucht: ExtractLinks()

Vorsicht vor Endlosschleifen. Und da alle Seiten einer web site einen nicht zyklusfreien Graph beliebigen Grades darstellen, sollte man auch eine maximale Rekursionstiefe festlegen.

Grüße vom marabu

pilic 25. Aug 2007 12:22

Re: Website durchsuchen
 
So nebenbei, Klaus01 er hat nach einer Website gefragt und nicht nach einer Webseite. Aber ich glaube nicht, dass es die Möglichkeit gibt das Verzeichnis zu durchsuchen, auch nicht mit php, da es ja nicht auf dem eigenen Server liegt.

marabu 25. Aug 2007 12:30

Re: Website durchsuchen
 
Hallo Dominik,

Zitat:

Zitat von Klaus01
... Eine Webs(e)ite besteht aus verlinkten html Seiten. ...

ich habe den Eindruck, dass Klaus den Unterschied sehr gut kennt. Lass dich vom Schreibfehler nicht täuschen.

Freundliche Grüße

Mark90 25. Aug 2007 13:13

Re: Website durchsuchen
 
hi marabu,

funzt sowas mit der indy nicht? Oder wie verwendest du diese funktion

Delphi-Quellcode:
procedure ExtractLinks(doc: IHTMLDocument2; s: TStrings);
var
  ec: IHTMLElementCollection;
  e: IHTMLElement;
  i: integer;
  url: Variant;
begin
  ec := doc.links;
  for i := 0 to Pred(ec.length) do
  begin
    e := ec.item(i, 0) as IHTMLElement;
    url := VarToStr(e.getAttribute('href', 0));
    if url <> '' then
      s.Add(url);
  end;
end;

marabu 25. Aug 2007 13:27

Re: Website durchsuchen
 
Hallo,

mit der Indy HTTP-Client-Komponente kannst du dir eine Datei per HTTP vom Server holen. Dann brauchst du einen Parser, der dir den komfortablen Zugriff auf ein HTML-Dokument gestattet und da bietet sich MSHTML an, weil es auf jedem PC vorhanden ist. Wenn du jetzt den per HTTP geholten Seitenquelltext z.B. mit der Funktion GetDocument() in ein IHTMLDocument lädst, dann kannst du mit ExtractLinks() alle Verweise in eine StringList übertragen.

Freundliche Grüße

Catbytes 25. Aug 2007 13:56

Re: Website durchsuchen
 
Zitat:

Zitat von marabu
...und da bietet sich MSHTML an, weil es auf jedem PC vorhanden ist...

Wirklich auf jedem? :wink: :mrgreen:

Mark90 25. Aug 2007 14:09

Re: Website durchsuchen
 
Zitat:

Zitat von marabu
Hallo,

mit der Indy HTTP-Client-Komponente kannst du dir eine Datei per HTTP vom Server holen. Dann brauchst du einen Parser, der dir den komfortablen Zugriff auf ein HTML-Dokument gestattet und da bietet sich MSHTML an, weil es auf jedem PC vorhanden ist. Wenn du jetzt den per HTTP geholten Seitenquelltext z.B. mit der Funktion GetDocument() in ein IHTMLDocument lädst, dann kannst du mit ExtractLinks() alle Verweise in eine StringList übertragen.

Freundliche Grüße

Noch ne kleine frage: in welcher unit befindet sich GetDocument?

Klaus01 25. Aug 2007 14:16

Re: Website durchsuchen
 
Hast Du die den Link zu GetDocument angeschaut, dort ist sie zu finden.

Grüße
Klaus

marabu 25. Aug 2007 14:20

Re: Website durchsuchen
 
Hallo,

damit du auf CoHtmlDocument und die anderen verwendeten Schnittstellen zugreifen kannst, musst du noch Mshtml in deine Uses-Klausel einbinden.


@Catbytes: Gibt es einen funktionierenden Windows-PC ohne Mshtml.dll? Der Explorer ist abhängig von Shdocvw.dll und diese Bibliothek baut auf Mshtml.dll auf. Weißt du das nicht oder willst du mir nur eine Lektion in Sophistik erteilen?

Freundliche Grüße

Mark90 25. Aug 2007 14:29

Re: Website durchsuchen
 
das hab ich gemacht jedoch meldet delphi bei GetDocument() undeclared identifier! hier mein code

Delphi-Quellcode:
....

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Mshtml, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    Button1: TButton;
    EdURL: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure ExtractLinks(doc: IHTMLDocument2; s: TStrings; SearchString: String);
var
  ec: IHTMLElementCollection;
  e: IHTMLElement;
  i: integer;
  url: Variant;
begin
  ec := doc.links;
  for i := 0 to Pred(ec.length) do
  begin
    e := ec.item(i, 0) as IHTMLElement;
    url := VarToStr(e.getAttribute(SearchString, 0));
    if url <> '' then
      s.Add(url);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  docd: IDispatch;
  doc: IHTMLDOCUMENT2;
  url: String;
begin
  url := EdUrl.Text;
  docd := GetDocument(IdHttp1.Get(url));

end;

Klaus01 25. Aug 2007 14:36

Re: Website durchsuchen
 
Delphi-Quellcode:
function GetDocument(const markup: WideString): IDispatch;
var
  doc: OleVariant;
begin
  Result := CoHtmlDocument.Create;
  doc := Result;
  doc.Open;
  doc.Write(markup);
  doc.Close;
end;
und war hier zu finden.
Und diesen Hinweis hat marabu noch dazu geschrieben:

Zitat:

Zitat von marabu
Dabei darfst du nicht vergessen die Units ActiveX und Mshtml einzubinden.

Grüße
Klaus

Mark90 25. Aug 2007 14:43

Re: Website durchsuchen
 
ich hab sie eingebunden aber es kommt immer noch eine fehlermeldung: Undeclared identifier

hier mein code:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Mshtml;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetDocument('xyz');
end;

end.

Klaus01 25. Aug 2007 15:27

Re: Website durchsuchen
 
Kommt die Fahlermeldung so auch immer noch ?
Grüße
Klaus
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActiveX, Mshtml;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetDocument(const markup: WideString): IDispatch;
var
  doc: OleVariant;
begin
  Result := CoHtmlDocument.Create;
  doc := Result;
  doc.Open;
  doc.Write(markup);
  doc.Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetDocument('xyz');
end;

end.

Mark90 25. Aug 2007 16:31

Re: Website durchsuchen
 
@klaus es kommt keine meldung mehr!! mein fehler war auf die 2. seite dieses threads zu wechseln :wall: :wall:

FAlter 25. Aug 2007 17:05

Re: Website durchsuchen
 
Hi,

Zitat:

Zitat von Catbytes
Zitat:

Zitat von marabu
...und da bietet sich MSHTML an, weil es auf jedem PC vorhanden ist...

Wirklich auf jedem? :wink: :mrgreen:

Zitat:

Zitat von marabu
@Catbytes: Gibt es einen funktionierenden Windows-PC ohne Mshtml.dll? Der Explorer ist abhängig von Shdocvw.dll und diese Bibliothek baut auf Mshtml.dll auf. Weißt du das nicht oder willst du mir nur eine Lektion in Sophistik erteilen?

ReactOS ??? :gruebel: Und wie war es eigentlich bei Win95 damals, da war ja der IE noch nicht standardmäßig dabei, wozu also damals MSHTML?

Mfg
FAlter

marabu 25. Aug 2007 20:08

Re: Website durchsuchen
 
Hallo Felix,

ob diese Haarspalterei Mark bei der Lösung seines Problems hilft?

Wenn sein in Delphi geschriebenes Programm irgendwann mal auf einem Windows-Clone ohne MSHTML laufen soll, dann werden ihm vielleicht DP-Mitglieder auch dabei helfen. Und in der Zwischenzeit hat er dann Kenntnisse im Umgang mit einer Microsoft-Basistechnologie erworben. Beim Einsatz eines alternativen Parsers kann er dann mit seinem Transferwissen glänzen.

Freundliche Grüße

Mark90 26. Aug 2007 12:13

Re: Website durchsuchen
 
Zitat:

Zitat von marabu
Hallo Felix,

ob diese Haarspalterei Mark bei der Lösung seines Problems hilft?

Wenn sein in Delphi geschriebenes Programm irgendwann mal auf einem Windows-Clone ohne MSHTML laufen soll, dann werden ihm vielleicht DP-Mitglieder auch dabei helfen. Und in der Zwischenzeit hat er dann Kenntnisse im Umgang mit einer Microsoft-Basistechnologie erworben. Beim Einsatz eines alternativen Parsers kann er dann mit seinem Transferwissen glänzen.

Freundliche Grüße

Ganz bestimmt nicht. Das Problem ist aber schon gelöst. Noch ne frage: was sollen denn diese Kommentare von Felix?

FAlter 26. Aug 2007 14:19

Re: Website durchsuchen
 
Hi,
erklär ich mal meine Kommentare:

ReactOS ??? -> Kurz für "Gibt es denn bei ReactOS sowas wie nen MSHTML-Clone?"

Und dann fragte ich mich auch noch, ob bei Win 95 MSHTML schon dabei war, wo doch der IE nicht dabei war (und der Windows-Explorer nicht auf diesen aufsetzte).

Es war eher als Frage gemeint und nicht als Kritik, da meine Vermutungen des Aussage, MSHTML sei auf jedem PC drauf, widersprechen (wobei ich mich auf die Systeme, auf denen Delphi 2+ Programme laufen) beschränkt habe.

Wenn meine Vermutungen mich nicht täuschen, müsstest du auf ReactOS und Windows 95 MSHTML erst noch installieren, bevor dein Programm dort läuft, wenn du MSHTML nutzt. Wobei derzeit sowieso viele größere Delphi-Projekte nicht auf ReactOS fehlerfrei laufen.

Mfg
FAlter


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.

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