Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi HTML Tabelle einlesen ? (https://www.delphipraxis.net/88200-html-tabelle-einlesen.html)

pH1L 11. Mär 2007 19:05


HTML Tabelle einlesen ?
 
Hallo,
wie kann ich mit Delphi und den Indys eine HTML Tabelle einlesen (in ein Record-Array, o.ä.) ?
Gibt es vielleicht einen guten (und in der Bedienung einfachen) Parser ?
Hab die Sufu und Google benutzt, bin aber noch auf nichts gestossen, das meinen Anforderungen entspräche :wall:

Danke schonmal im Vorraus fürs Antworten, mfg pH1L

marabu 12. Mär 2007 08:01

Re: HTML Tabelle einlesen ?
 
Herzlich willkommen in der Delphi-PRAXiS, Phil - auch wenn du schon eine Weile mitliest.

Die Unit MSHTML enthält eigentlich alles was du zum Parsen von HTML-Dokumenten brauchst. So kannst du vorgehen:

(1) Hole das gewünschte HTML-Dokument aus dem Internet.

Delphi-Quellcode:
function GetDocument(const uri: string; var doc: IHTMLDocument2): Boolean;
var
  s: TStream;
begin
  Result := False;
  s := TMemoryStream.Create;
  with TIdHTTP.Create(nil) do
  try
    Get(uri, s);
    Result := LoadDocument(doc, s);
  finally
    Free;
    s.Free;
  end;
end;
(2) Besorge dir die gewünschte Table.

Delphi-Quellcode:
function GetTable(doc: IHTMLDocument2; v: OleVariant; var t: IHTMLTable): Boolean;
var
  ec: IHTMLElementCollection;
  e2: IHTMLElement2;
begin
  Result := True;
  e2 := doc.body as IHTMLElement2;
  ec := e2.getElementsByTagName('table');
  if ec.length > 0
    then t := ec.item(v, null) as IHTMLTable
    else REsult := False;
end;
(3) Übernehme die Zellen der Tabelle in ein StringGrid.

Delphi-Quellcode:
procedure GetCells(tr: IHTMLTableRow; sg: TStringGrid; index: Integer);
var
  i: Integer;
  ec: IHTMLElementCollection;
  e: IHTMLElement;
  s: TStrings;
begin
  s := sg.Rows[index];
  s.Clear;
  ec := tr.cells;
  if sg.ColCount < ec.Length then
    sg.ColCount := ec.length;
  for i := 0 to Pred(ec.length) do
  begin
    e := ec.item(i, null) as IHTMLElement;
    s.Add(e.innerText);
  end;
end;

procedure GetRows(t: IHTMLTable; sg: TStringGrid);
var
  i: Integer;
  ec: IHTMLElementCollection;
begin
  ec := t.rows;
  sg.RowCount := ec.length;
  for i := 0 to Pred(ec.length) do
    GetCells(ec.item(i, null) as IHTMLTableRow, sg, i);
end;
Das ist der grobe Rahmen, den du verfeinern kannst. Steckt die Tabelle in einem Frame, dann musst du das Dokument des Frames bereitstellen. Dabei hilft dir sicher die Funktion GetFrameDoc. Auch die Funktionen LoadDocument und ProcessMessages findest du hier im Forum. Viel Erfolg.

Freundliche Grüße vom marabu

pH1L 12. Mär 2007 13:33

Re: HTML Tabelle einlesen ?
 
Vielen Dank für die umfangreiche Antwort :dp: :-D

Eine Frage hätte ich aber noch: Welche Unit benötige ich für
die Funktion "LoadDocument" ?

marabu 12. Mär 2007 13:55

Re: HTML Tabelle einlesen ?
 
LoadDocument() verlangt die Units MSHTML und ActiveX.

Freundliche Grüße

pH1L 12. Mär 2007 14:08

Re: HTML Tabelle einlesen ?
 
Das ging aber schnell :shock:
Danke, jetzt lässt sichs kompilieren.

cherry 24. Mai 2008 19:26

Re: HTML Tabelle einlesen ?
 
hmm ich hab jetzt folgenden Aufruf:

Delphi-Quellcode:
  htmldoc : IHTMLDocument2;
begin

  try
    if GetDocument('http://www.flug-reisecenter.de/online_buchen/buma_lastminute.html', htmldoc) = true then
      showmessage('load successful')
    else
      showmessage('load failed');
  except
    MessageDlg(msg0001,mtWarning,[mbOk],0);
  end;
leider kommt immer die Message "load failed"...
was mach ich falsch?

marabu 24. Mai 2008 20:02

Re: HTML Tabelle einlesen ?
 
Ein Blick in die Funktion GetDocument() sagt dir, dass LoadDocument() verantwortlich für die Meldung ist. Ein weiterer Blick auf LoadDocument() offenbart, dass FALSE zurückgegeben wird, wenn die Variable htmlDoc noch nicht initialisiert wurde.

Was machst du da gerade? Copy-And-Paste?

cherry 25. Mai 2008 13:59

Re: HTML Tabelle einlesen ?
 
huch.. :shock: hab eben noch nie was mit mshtml gemacht und brauchte dringend was... also bastle ich mir was zusammen... so kann ich das am schnellsten lernen. Und nein c&p stimmt nicht ganz, ich schreibs immer ab damit ichs besser kappiere...

cherry 26. Mai 2008 19:45

Re: HTML Tabelle einlesen ?
 
habs jetzt stundenlang versucht aber ich kriegs einfach nicht hin... wie gesagt in dem Gebiet bin ich ein Blutiger Anfänger. Deshalb wäre ich um eure Hilfe echt froh.

ich versuch zuerst mal eine einzige zelle auszulesen..
ich habs mal so versucht... aber da krieg ich bei der Funktion "GetCells" eine Zugriffsverletzung, und zwar genau hier: ec := tr.cells;

ich weiss... vermutlich mach ich was ganz fallsch und kappiers von grund auf nicht... deshalb schreib ichs ja hier rein ;-)

Delphi-Quellcode:
procedure TForm1.EButton4Click(Sender: TObject);
var
  t: IHTMLTable;
  row: IHTMLTableRow;
  doc: IHTMLDocument2;
begin
  doc := CoHTMLDocument.Create as IHTMLDocument2;
  if GetDocument(Edit1.Text, doc) = true then
  begin
    try
      // holt die erste tabelle
      GetTable(doc,1,t);
    except
      Showmessage('gettable = false');
      exit;
    end;
    begin
      if Assigned(t) = false then
        showmessage('t not assigned');
      //showmessage(t.rows.toString);
      // holt die erste zeile
      row := t.rows.item(1, null) as IHTMLTableRow;
      // sollte die erste zelle holen
      GetCells(row,StringGrid1,1)
    end
  end
  else
    showmessage('getdoc = false');
end;

marabu 26. Mai 2008 21:22

Re: HTML Tabelle einlesen ?
 
Hi,

das hast du schon ganz gut gemacht.

Hier noch ein paar Änderungen:

Delphi-Quellcode:
procedure TForm1.EButton4Click(Sender: TObject);
var
  t: IHTMLTable;
  row: IHTMLTableRow;
  doc: IHTMLDocument2;
begin
  doc := CoHTMLDocument.Create as IHTMLDocument2;
  if GetDocument(Edit1.Text, doc) then
  begin
    if GetTable(doc, 0, t) then // first Table
    begin
      row := t.rows.item(0, null) as IHTMLTableRow; // first Row
      if Assigned(row)
        then GetCells(row, StringGrid1, 0) // StringGrid.Row = 0 
        else ShowMessage('no rows found');
    end else ShowMessage('no tables found')
  end else ShowMessage('GetDocument failed');
end;
Der letzte Parameter von GetCells() gibt die Row im StringGrid an, in der die Zellen einer Tabellenzeile abgelegt werden sollen.

Getippt und nicht getestet.

Gute Nacht


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 Uhr.
Seite 1 von 2  1 2      

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