![]() |
Tabelle aus HTML auslesen
Hi ich will eine Tabelle aus eine HTML-Seite übernehmen.
Der User muß vorab über eine EmbeddedWB-Komponente navigieren und dann soll per Button die dargestellte Tabelle übernommen werden. Hier mal mein Code, den ich unter zur Hilfenahme von ![]()
Delphi-Quellcode:
Und hier meine Procedure vom Button:
function Tfrm_kasys_datenabruf.GetDocument(var doc: IHTMLDocument2): Boolean;
begin Result:=False; Try doc:=embeddedWB1.Doc2 as IHTMLDocument2; Result:=True; Except Result:=False; End; end; function Tfrm_kasys_datenabruf.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; procedure Tfrm_kasys_datenabruf.GetCells(tr: IHTMLTableRow; sg: TAdvStringGrid; 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 Tfrm_kasys_datenabruf.GetRows(t: IHTMLTable; sg: TAdvStringGrid); 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;
Delphi-Quellcode:
Ich bekomme immer die Meldung 'Keine Tabelle gefunden', das letztlich heißt, dass die Function GetTable halt nix findet.
procedure Tfrm_kasys_datenabruf.LeseDocumentTable;
var doc: IHTMLDocument2; t: IHTMLTable; row: IHTMLTableRow; begin Doc := CoHTMLDocument.Create as IHTMLDocument2; if GetDocument(doc) then begin if GetTable(doc, 0, t) then begin row:=t.rows.item(0, null) as IHTMLTableRow; if Assigned(row) then GetCells(row, sg_abruf, 0) else ShowMessage('Keine Zeilen gefunden'); end else ShowMessage('Keine Tabelle gefunden'); end else ShowMessage('Keine Document erhalten'); end; Jetzt würde ich gerne den Inhalt von e2 bzw. ec mal im Debugger anzeigen lassen. Sind aber Pointer und ich kann lediglich die Adresse sehen. Wie kann ich mir den Inhalt anzeigen lassen, auf den die Pointer zeigen? (Wenn jemand natürlich sieht, wo mein Fehler liegt, dann hab ich auch nichts dagegen.) |
AW: Tabelle aus HTML auslesen
Es ist aber eine (HTML-)Tabelle im Dokument enthalten? Moderne Systeme verwenden ja zunehmenst immer weniger originäre HTML-Tags und ersetzen alles durch JS erzeugte Konstrukte ( Selbst Links und Bilder werden oft so eingebunden)
|
AW: Tabelle aus HTML auslesen
Guten Morgen ;-)
Hast recht. Mist. Hab mir grad, auf deinen Hinweis hin, den HTML-Code nochmal angeschaut. Da ist tatsächlich eine table in einer table, wobei nur die innere die Daten enthält. (Ich darf leider die Seite hier nicht posten. Ich müßte erst sämtliche Daten verfremden.) Aber er schein ja schon die erste Tabelle nicht zu finden. |
AW: Tabelle aus HTML auslesen
Zitat:
|
AW: Tabelle aus HTML auslesen
@Captnemo
Wobei, aber da weiß ich nicht wie man das lösen kann, ist eine über den Browser kopierte Tabelle eine Tabgetrennte CSV-Tabelle. Und es ist ja nichts leichter als eine CSV-Tabelle einzulesen. Oder muß es über den Quellcode der Html-Seite sein? |
AW: Tabelle aus HTML auslesen
Die Tabelle ist im Document schon mit den herkömlichen Tags <table>...</table> realisiert. Java/CSS wird nur für das Menü und ein paar Darstellungen verwendet.
Natürlich würde das ggf. auch über copy/paste gehen. Finde ich aber nicht so glücklich, weil ich dann ja immer aufpassen muß, was denn der Anwender mit seiner Maus noch so alles markiert und mit kopiert hat. Nein, das sollte schon direkt im Quellcode gehen. Ich kann natürlich auch einfach den Quellcode nehmen, alles rausschmeißen, was ich nicht brauche, die table isolieren und dann das ganze direkt auslesen. Aber ich dachte mir wenn es mit MSHTML besser geht, wäre das ja eleganter. Nur habe ich damit noch so gar keine Erfahrungen. Und wie in meinem ersten Post bereits geschrieben, wäre es toll und hilfreich, wenn ich innerhalb der Procedure/Functionen mir die Variablen ansehen könnte. Aber weil das alles nur Pointer sind, weiß ich nicht, wie ich an die dahinter liegenden Daten rankomme. |
AW: Tabelle aus HTML auslesen
An für sich ist es nicht so schwer, auch den HTML Code parsen. Ich weiß, dass ich das mindestens schon ein mal ümgesetzt habe, vielleicht sogar als Beispiel hier irgendwo, oder DelphiForum. Demnach müßte es schon hier irgendwo rumliegen. Ich suche mal.
|
AW: Tabelle aus HTML auslesen
Ich hab Just4Fun einen Parser programmiert. Memo1 enthält den ganzen Html-Code, es wird die erste gefundene Tabelle bearbeitet, Ergebnis steht im Memo2. Zwei Probleme gibt es noch: es wird nur nach kleingeschriebenen Tags gesucht, hier muß es noch so umgeschrieben werden, dass Groß-/Kleinschriebung nicht beachtet wird. Dann müssen noch die Umlaute (München für München) konvertiert werden.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
function MyPos(Substr: string; S: string): Integer; begin Result := Pos(Substr, S); end; function ExtractTagArea(var HtmlCode: String; Tag: String): String; var p: Integer; begin Result := HtmlCode; p := MyPos('<' + Tag, Result); if p > 0 then Delete(Result, 1, p); p := MyPos('>', Result); if p > 0 then Delete(Result, 1, p); p := MyPos('</' + Tag + '>', Result); if p > 0 then begin HtmlCode := Copy(Result, p + Length('</' + Tag + '>'), MaxInt); Delete(Result, p, MaxInt); end; end; function TrLineToCsvLine(TrLine, Tag: String): String; var sTd: String; begin Result := ''; while MyPos('<' + Tag, TrLine) > 0 do begin sTd := ExtractTagArea(TrLine, Tag); Result := Result + sTd; if MyPos('<' + Tag, TrLine) > 0 then Result := Result + #9; end; end; var sTmp, sTabelle, sTr: String; sl: TStringList; s: String; begin sl := TStringList.Create; try sTmp := Memo1.Lines.Text; sTabelle := ExtractTagArea(sTmp, 'table'); while MyPos('<tr', sTabelle) > 0 do begin sTr := ExtractTagArea(sTabelle, 'tr'); s := TrLineToCsvLine(sTr, 'th'); if Length(s) = 0 then s := TrLineToCsvLine(sTr, 'td'); sl.Add(s); end; Memo2.Lines.Text := sl.Text; finally sl.Free; end; end; |
AW: Tabelle aus HTML auslesen
Zitat:
a) Du hast
Delphi-Quellcode:
mit poptr^ werden im Debugger 3 Byte angezeigt.
type
tmyarray : array [0..2] of byte; var poptr= ^myarray; b) Du hast einen "nackten" Pointer
Delphi-Quellcode:
dann erhälst Du mit myarray(poptr^)[0] das erste Byte von der Adresse auf die der Pointer zeigt, und mit integer(poptr^) den wert der gleichen Speicheradresse als Integer.
type
tmyarray : array [0..2] of byte; var poptr= pointer; Das Funktioniert natürlich auch mit anderen Typen. Gruß K-H |
AW: Tabelle aus HTML auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Komme leider mit den Beispielen nicht weiter. Der Grund wird sein, dass die Seite aus der ich die Daten auslesen muß Frames verwendet. Das wäre ja nicht so schlimm, denn es gibt ja einige Beispiele, die beschreiben wie man den Inhalt der Frameset ausliest.
Nur blöderweise verwendet die Webseite verschachtelte Framesets. Und ich komme da einfach nicht ran. Bei allen Möglichkeiten, die ich ausprobiert habe, komme ich immer nur zum ersten Frameset, aber nicht an die in der Tiefe. Als Anlage mal ein Bild, wenn ich im Internetexplorer mir das mit den Entwicklertools anzeigen lassen. Kann mir jemand helfen, wie ich da ran komme? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 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