Entwickler-Ecke

Open Source Units - HTML-Object-Parser


r4id3n - Do 30.12.04 01:51
Titel: HTML-Object-Parser
Hallo zusammen, nachdem ich eine reihe positiver resonanzen bekommen habe, hier also der Source meines HTML-Parsers.

Funktion

- erstellt aus einem gegebenen HTMLString (Dokument, etc.) eine Liste von Objekten, die jeweils wiederrum einzelne UnterObjekte enthalten. So wird aus
<HTML><TITLE>Test</TITLE></HTML>z.b.

Quelltext
1:
2:
3:
|---TAG:HTML
     |---TAG:Title
           |---VALUE:Test

- erlaubt es an beliebigen stellen der so erzeugten Objektliste weitere "Elemente" einzufügen
- aus der Elementenliste wieder eine HTML-Datei zu machen.

Da die UNIT etwas zu groß ist, habe ich sie auf meinen Webserver kopiert! (dependencies und doku sind inbegriffen!)

Ein wichtiger hinweiß noch! Das ganze steht unter GPL! D.h. ihr könnt das für eure Projekte verweden, vorrausgesetzt, dass diese ebenfalls open source sind, und ihr das copyright beibehaltet. Sollte interesse an einer kommerziellen verion bestehen, so verkaufe ich den source auch in einer nicht GPL version gegen eine kleine Spende ;-)

Und hier der LINK: http://www.aixhost.de/HTMLParser.rar


retnyg - Do 30.12.04 04:42

hört sich super an, liest der auch die class eigenschaft eines Tags aus ? oft gebraucht für stylesheets


r4id3n - Do 30.12.04 11:57

Alles, was in der form <TAG NAME="VALUE"> ist, kann gelesen werden!
Falls ihr was fidet, was ich noch nicht beachtet habe, würde ich mich über eine kurze pn freuen!


r4id3n - Fr 07.01.05 17:37

Da hat sich noch ein kleiner Bug eingeschlichen ... Beim Createn des THTMLDocuments kann man derzeit leider noch nicht den HTMLString angeben ... Das werde ich übers WE fixen, dann gibts auch noch eine etwas erweiterte funktion! Würde mich freuen, wenn diejenigen, die den Parser benutzen, mir ne kurze PN schicken könnten !


r4id3n - Do 03.02.05 00:34

Hallo, nachdem sich nun bereits 75 User diese Unit angeschaut haben, wäre es nett... Wenn mir zumindest 5 - 10% ihre Meinung dazu schreiben würden ....
Wo verwendet ihr meinen Parser ? Läuft er schnell genug? Fehler gefunden?


mirage228 - Do 03.02.05 07:52

r4id3n hat folgendes geschrieben:
Hallo, nachdem sich nun bereits 75 User diese Unit angeschaut haben, wäre es nett... Wenn mir zumindest 5 - 10% ihre Meinung dazu schreiben würden ....
Wo verwendet ihr meinen Parser ? Läuft er schnell genug? Fehler gefunden?


Hi,

evenutell solltest Du eine kleine Demo-Application basteln, die die Zeiten beim Parsen gleich mitmisst und anzeigt.
Dann könnte man auch schneller den Umgang mit der Unit lernen ;)

mfG
mirage228


DSeven - Mi 30.03.05 23:20

wow sowas suche ich schon seit längerem verzeifelt. Dachte schon das ich das selber machen muss :wink:
Die Unit passt perfekt in meine PHP IDE werde die Unit bald einbauen und hier mal einen kleinen Screeni veröffentlichen.

Danke für die Unit.

cya


Delete - Do 31.03.05 00:47

Ich denke, ich werde sie vllt. in dem einem oder anderen Projekt verwenden, wo ich eine HTML-Logdatei brauchen könnte....

Hübsches Ding (die Unit)


DSeven - Do 31.03.05 04:32

Hmm finde den Kommentar von dir in der Datei sehr lustig.
Also du veröffentlichst die unit unter GPL (LGPL währe besser) und schreibst dann wenn jemand die unit kommerziel nutzen möchte soll sich melden.
Die GPL schließt eine kommerziele nutzung mit ein also ist der kommentar unnötig.
Du meinst wohl eher die kommerzielle Nutzung und das der Author seinen source nicht unter GPL stellen muss.

Und noch ein paar verbesserungsvorschläge die unbedingt gemacht werden müssen:
1. Ein und ausschalten von Kommentaren man soll wählen können ob sie geparst werden oder nicht.
2. Du hast einen Fehler in der Create Methode wo man einen String übergibt.
3. Es sollte ein property bei den Tags geben um die Position raus zu finden.

so das wars :)

cya


Micho - Sa 14.05.05 22:01
Titel: Re: HTML-Object-Parser
Hallöle,

Erstmal danke, für den HTML-Parser.

Hab' hier eine nicht ganz HTML-konforme Datei versucht zu parsen, womit er aber Probleme hat.

Das Beispiel:
<font ...><a href=...>Text</a>

Der Parser erkennt, dass der font-Tag nicht geschlossen wird und sucht dann nach dem nächsten Tag. Hier hat sich scheinbar ein kleiner Fehler eingeschlichen, da der nächste Tag, den er findet, erst das </a> ist.

Das Problem liegt in der THTMLDocument.ParseSubPart-Prozedur.

Die letzten Zeilen lauten:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
        begin
            TagElem.IsSpanningTag:=false;
            TagEndPos:=TagStartPos;
        end;
    end;
end;

Richtig ist:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
        begin
            TagElem.IsSpanningTag:=false;
            TagEndPos:=TagStartPos-1;
        end;
    end;
end;

Da fehlt also noch ein -1. Vielleicht konnte ich damit helfen ;)

Als Anmerkung: Vielleicht sollte der Parser auch von vornherein öffnende von schließenden Tags unterscheiden, denn es gibt ne ganze Menge dreckigen HTML-Code da draußen ...


r4id3n - Do 26.05.05 22:08

Danke für den Tipp ... Ich werde bei gelegenheit die aktuelle Version posten .... Habe in der zwischenzeit noch so einiges mehr korrigiert.


rstaeker - Fr 08.07.05 11:28

user profile iconr4id3n hat folgendes geschrieben:
... Ich werde bei gelegenheit die aktuelle Version posten .... Habe in der zwischenzeit noch so einiges mehr korrigiert.

Ich habe mir die Komponente auch schon mal mit obigen Link herunter geladen.
Gibt es die neuere Version auch irgendwo. Mit den Korrekturen.

MfG Rene


r4id3n - Fr 08.07.05 12:10

Ich war leider in letzter Zeit etwas Busy wegen meiner HöMaII Klausur ... Jetzt, wo die Zeit wieder etwas besser bemessen ist, werde ich auch die Arbeit an meinem CMS wieder aufnehmen ... Dazu wird dann auch in nächster Zeit eine neue Version des Parsers veröffentlicht!


r4id3n - Mo 11.07.05 19:27

UPDATE:

Neue Funktionen, Bugfixing! URL ist gleich!

Happy testing!


retnyg - Sa 27.08.05 06:37

ich wollte das teil vorhin mal verwenden.
nach ner halben stunde rumprobieren ist mir die lust aber gründlich vergangen.

wenn du willst dass jemand ausser dir das ding einsetzt, muss ein demo prog her, dass einem zeigt wie man es richtig anwendet.


er_nevro - So 23.10.05 22:11

user profile iconretnyg hat folgendes geschrieben:
ich wollte das teil vorhin mal verwenden.
nach ner halben stunde rumprobieren ist mir die lust aber gründlich vergangen.

wenn du willst dass jemand ausser dir das ding einsetzt, muss ein demo prog her, dass einem zeigt wie man es richtig anwendet.


dit0!
Mehr gibbet nit zu sagen, bis ich genau die einekleine Funktion gefunden habe die ich brauche, ist mit die Lust auf mein aktuelles Projekt vergangen *dillemma*


Robert_G - So 23.10.05 22:30

Mädels, Mädels... Sagt mal geht es vielleicht auch freundlicher? :roll:

Der Autor hat hier etwas gemacht, dass ihn von 99% aller Freeware/OSS Autoren in diesem Forum unterscheidet: Er hat eine erstklassige und umfangreiche Dokumentation beigelegt :!:
Da er dazu inline Docu comments verwendet hat ist sogar der source code schon beim Überfliegen prima nachvollziehbar.
Was will man da mehr? :gruebel:


retnyg - So 23.10.05 22:59

user profile iconRobert_G hat folgendes geschrieben:
Mädels, Mädels... Sagt mal geht es vielleicht auch freundlicher? :roll:

ich sage meistens das, was ich mir denke...
user profile iconRobert_G hat folgendes geschrieben:
Der Autor hat hier etwas gemacht, dass ihn von 99% aller Freeware/OSS Autoren in diesem Forum unterscheidet: Er hat eine erstklassige und umfangreiche Dokumentation beigelegt :!:

erstklassig ? ein skript das mir alle zeilen mit methodendeklarationen in ein html schreibt ist in 5min gecodet
user profile iconRobert_G hat folgendes geschrieben:
Da er dazu inline Docu comments verwendet hat ist sogar der source code schon beim Überfliegen prima nachvollziehbar.

interessant, ich habe die doku gelesen, habe aber trotzdem nicht rausgefunden wie ich alle hyperlinks aus einer seite extrahiere.
insgesamt habe ich mit der unit, ohne ein resultat zu kriegen, mehr zeit verbraten als mir einen eigenen hyperlink-extractor zu programmieren.
user profile iconRobert_G hat folgendes geschrieben:
Was will man da mehr? :gruebel:

ein an die praxis angelehntes demo-programm z.b., wo man sieht wie die vorgesehene anwendung auszusehen hat.


rstaeker - Mo 24.10.05 09:30

Morgen,

@retnyg
Die Unit ist sicher nicht dazu gedacht, nur die Hyperlinks aus einem Dokument zu extrahieren. Sicher solche einfacher Funktionen kann man vielleicht selbst schneller programmieren. Aber dann reg Dich nicht darüber auf.

Die Unit ist bei komplexen Html Seiten aber sehr sinnvoll und die Doku ist auch in Ordnung.
Ich selbst benutze die Unit um komplette HTML Seiten mit Tabellen zu zerlegen, die Daten in den Tabellen zu extrahieren und neue HTML Seiten mit komplett anderer Struktur zusammen zu bauen.

Meiner Meinung nach ist diese Unit eine klasse Arbeit und für ein OpenSource Projekt vollkommen ausreichend.

MfG
Rene


neeoo - Fr 02.12.05 14:24

Erstmal vielen Dank für die super Klassen!!!

Ich hab trotzdem ein Problem! :(



Quelltext
1:
<strong>text1<br>text2</strong>                    



Delphi-Quelltext
1:
2:
3:
4:
5:
sText := '';
for iLoop := 0 to Element.ChildCount - 1 do begin
 _Element := Element.ChildItems[iLoop];
 sText := sText + _Element.Content + ' ';
end;


Leider wird nur text2 ausgelesen und text1 kann ich nirgends finden! :(

Ist es ein Bug oder mache ich etwas falsch?


Neeoo


MrSaint - Di 03.01.06 12:36

Hi!

Hab den Parser auch mal getestet und hab mir dazu ein kleines Testprogramm geschrieben. Großes Problem bei folgendem Quelltext:


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>

<BODY>

<font face="Verdana">Hallo <b> du da</font><font face="Courier New"> Ich bin </b>Courier!</font>

</BODY>
</HTML>


Ausgabe: Siehe Anhang!




MrSaint

Moderiert von user profile iconChristian S.: Code- durch XML-Tags ersetzt


r4id3n - Di 03.01.06 17:02

Der Parser hat in der tat einige Parsingprobleme auf die ich leider auch gestoßen bin!
Auch gibt es einige Probleme mit XHTML ...

Ich werde, sobald ich wieder etwas Zeit finde, die Version 2 des Parsers hier vorstellen!

BTW: Links finden ist doch ganz einfach ;-)


Delphi-Quelltext
1:
function GetElementListByTag(Tag:String):TList;                    


Ruf doch die einfach mal mit


Delphi-Quelltext
1:
MeineListe:=HTMLDokument.GetElementListByTag('A');                    


auf !?

In der Liste befinden sich dann alle
THTMLElements mit Tag A

Wichtig allerdings!!! Die Elemente der Liste nicht freigeben! Auch stehen die Elemente nur zur Verfügung, solange HTMLDokument nicht freigegeben wurde!!!!

@MrSaint, könntest du dein Demoprogramm villeicht mal für die allgemeinheit posten? Dann brauch ich keins zu schreiben ;-);-)


Und danke für eure Comments ... Auch wenn die nicht immer ganz positiv waren!


MrSaint - So 08.01.06 12:48

Oh, öhm, das Testprogramm hat leider schon die ewigen Datengründe erreicht... War aber nichts tolles... Ein SynEdit in das der zu untersuchende HTML Code kam, ein Button zum analysieren und ein TTreeView zur Ausgabe. Beim Buttonklick habe ich den Code von deinem Parser parsen lassen und habe dann das ergebnis mit einer rekursiven Methode in dem TreeView ausgegeben... Also nichts sonderlich großes, 5-10 Minuten ;)



MrSaint


Delete - Do 09.02.06 17:45

Hi r4id3n, ich bin im Moment dabei deine Komponente zu benutzen, allerdings stellt sich mir dabei ein Problem: Ich bräuchte die Position der jeweiligen Tags (evtl. als Property von THTMLElement), damit man einfach in der Datei dahinspringen kann?
Ist das evtl. mit deiner Komponente machbar oder kann jemand eine andere Empfehlen die das beherrscht, obwohl ich schon gern bei dieser bleiben würde, da ich sie sonst recht praktisch finde...

Danke und Gruß
Benedikt


neeoo - Di 11.04.06 10:30

r4id3n:

wann können wir mit der version 2 rechnen??? :P


neeoo


0xCC - Fr 05.05.06 00:19

user profile iconr4id3n hat folgendes geschrieben:
Der Parser hat in der tat einige Parsingprobleme auf die ich leider auch gestoßen bin!
Auch gibt es einige Probleme mit XHTML ...

Ich werde, sobald ich wieder etwas Zeit finde, die Version 2 des Parsers hier vorstellen!

BTW: Links finden ist doch ganz einfach ;-)


Delphi-Quelltext
1:
function GetElementListByTag(Tag:String):TList;                    


Ruf doch die einfach mal mit


Delphi-Quelltext
1:
MeineListe:=HTMLDokument.GetElementListByTag('A');                    


auf !?

In der Liste befinden sich dann alle
THTMLElements mit Tag A

Wichtig allerdings!!! Die Elemente der Liste nicht freigeben! Auch stehen die Elemente nur zur Verfügung, solange HTMLDokument nicht freigegeben wurde!!!!

@MrSaint, könntest du dein Demoprogramm villeicht mal für die allgemeinheit posten? Dann brauch ich keins zu schreiben ;-);-)


Und danke für eure Comments ... Auch wenn die nicht immer ganz positiv waren!


also so ?
das scheint aber irgendwie nicht zu funktionieren...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var doc : THTMLDocument;
    body: THTMLElement;
    i:integer;
    l:tlist;
begin
    doc.Create(readtextfile('C:\danzig.html'));
    body := doc.GetBodyElement ;
    //l := tlist.Create ;
    l :=    doc.GetElementListByTag('TABLE');

    caption := inttostr(l.Count);
    for i := 0 to l.Count - 1  do
       memo1.lines.add( THTMLElement(l.items[i]).Content );
    l.free;

    (*    doc.ToTHTMLElementList
    for i := 0 to body.ChildCount -1 do begin
       body.ChildItems[i].
    end; *)

end;


ausserdem gibts ne access violation beim schliessen des progs


7down - Mo 19.02.07 18:17

Hallo,

ich weiß, der Thread is schon ein "Bisschen" alt *g*..
Aber ich bräuchte die neuste Version dieser Klasse, allerdings ist der Downloadlink tot :(

Oder hat/kennt jemand eine ähnliche Klasse/Komponente, die zu einer HTML-Seite den Objektbaum erstellt?

Vielen Dank schonmal

7down


Delete - Mo 19.02.07 18:32

Hi,

ich hab die Komponente bei mir aufm Rechner und nutze sie auch aktiv. Wenn du willst kann ich sie dir online stellen.

MfG Benedikt Loepp


7down - Mo 19.02.07 18:42

Das wär natürlich super :)

Danke dir schonmal!


7down - Mo 19.02.07 21:38

Habe die Komponente jetzt per PN bekommen aber noch schnell für die Öffentlichkeit hochgeladen :)
http://rapidshare.com/files/17263668/HTMLParser.rar.html

Ich guck mich jetzt mal bissel um, wenn ich noch Frage hab, werd ich euch nicht verschonen :D


Danke&Ciao
7down


hui1991 - Mo 19.02.07 22:42

Und nach 30 Tagen wenn des zeug nicht runtergeladen wird, dann ist die Datei weg.
Warum lädt ihr die Datei net einfach hier hoch?
Dann bleibt die Datei länger erhalten.
Ich lade des lieber etz hoch, bevor es keiner macht.

MfG
hui1991


mimi - Do 27.12.07 19:28

hat jemand zufällig gerade von euch ein Beispiel zur hand wie man diese Unit/klasse nutzt ?

Bin am überlegen ob ich sie bei mir unter Lazarus einsetzten könnte/sollte für ein Projekt was ich dann allerdings komplet neu erstellen müsste. Wurden denn schon die angesprochenen Fehler gefunden ?


MDX - Mi 25.02.09 05:21


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>

<BODY>

<font face="Verdana">Hallo <b> du da</font><font face="Courier New"> Ich bin </b>Courier!</font>

</BODY>
</HTML>


Naja, ist kein Wunder das Fehler kommen, bei nem falschen HTML Code xD

Zum Thema:
Gutes "Programm"