![]() |
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 |
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:
(2) Besorge dir die gewünschte Table.
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;
Delphi-Quellcode:
(3) Übernehme die Zellen der Tabelle in ein StringGrid.
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;
Delphi-Quellcode:
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
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; ![]() ![]() Freundliche Grüße vom marabu |
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" ? |
Re: HTML Tabelle einlesen ?
LoadDocument() verlangt die Units MSHTML und ActiveX.
Freundliche Grüße |
Re: HTML Tabelle einlesen ?
Das ging aber schnell :shock:
Danke, jetzt lässt sichs kompilieren. |
Re: HTML Tabelle einlesen ?
hmm ich hab jetzt folgenden Aufruf:
Delphi-Quellcode:
leider kommt immer die Message "load failed"...
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; was mach ich falsch? |
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? |
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...
|
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; |
Re: HTML Tabelle einlesen ?
Hi,
das hast du schon ganz gut gemacht. Hier noch ein paar Änderungen:
Delphi-Quellcode:
Der letzte Parameter von GetCells() gibt die Row im StringGrid an, in der die Zellen einer Tabellenzeile abgelegt werden sollen.
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; Getippt und nicht getestet. Gute Nacht |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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