Bug in Unit sax_html.pas?

Rund um die LCL und andere Komponenten
Antworten
Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Bug in Unit sax_html.pas?

Beitrag von Antrepolit »

Hallo Leute,

ich bitte um eine Bestätigung folgenden Fehlverhaltens einer Klasse in der Unit SAX_HTML. Ich weiß nicht genau an welcher Klasse es liegt.

Das Problem macht sich darin bemerkbar, dass HTML-Tags zu einem inkorrekten DOM führen.

Ich Parse eine HTML-Seite. In deren Quelltext befinden sich Kommentare der Form <!-- Bla bla -->. Scheinbar verursachen diese eine Fehlinterpretation.

EIn Beispiel-Ausschnitt:

Code: Alles auswählen

<div class="yom-mod yom-art-content " id="mediaarticlebody" itemprop="articleBody"><div class="bd"><!-- google_ad_section_start -->
<p class="first"></p>
Das führt dann zu folgendem (ungefähr):

Code: Alles auswählen

<div class="yom-mod yom-art-content " id="mediaarticlebody" itemprop="articleBody"/><div class="bd"><p class="first"></p>
Der Node wird also geschlossen, obwohl er ChildNodes hat.

Nun ist die Unit schon 11 Jahre alt, daher schließe ich keine Bugs aus. Bevor ich jedoch einen Bug melde, würde ich mich über eine Bestätigung meiner Beobachtung freuen. Das Große Problem ist nämlich, dass auf der Unit viele HTML-Funktionen wie ReadHTMLFile aufbauen.

Ein Hinveis in der Unit ist folgender, der aber nicht zuzutreffen scheint. Auf der anderen Seite gibt es im Text von Knoten weitere Tags (z. B. ein <a>-Tag eines Links im Fließtext.

Code: Alles auswählen

* Entity references in attribute values don't get parsed.
Nun kann ich mir aber nicht vorstellen, dass dadurch derartige Fehler entstehen können.
Grüße, Antrepolit

care only if your os is really burning

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Bug in Unit sax_html.pas?

Beitrag von Socke »

Hast du ein Stück Code, mit dem ich das ausprobieren kann?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Bug in Unit sax_html.pas?

Beitrag von Antrepolit »

Socke hat geschrieben:Hast du ein Stück Code, mit dem ich das ausprobieren kann?
Leider habe ich verschachtelte Klassen und verwende einen Stream. Einen halbfertigen Auszug kann ich dennoch posten. Musste einiges an Workaround betreiben, um auf 64-Bit Webseiten laden zu können, da Synaser ja leider nur 32 Bit kann. Daher war es etwas schwieriger, die Seite als Stream zu bekommen. Ich verwende dazu Windows-Systemfunktionen. Aber mit einer auf die Platte geschriebenen HTML-Datei sollte es einfacher gehen.

Nach einigen Tests scheint yahoo Finance recht viele solcher Fehler zu produzieren. Aber vermutlich dürfte auch Facebook als Fehlerquelle taugen. Die Fehler in der Ausgabedatei treten bei mir an der Stelle auf, wo in der Originalquelle HTML-Kommentare wären. Diese werden zurecht entfernt, aber dies scheint den Fehler zu produzieren.

Im Code-Beispiel beinhaltet fInStream also schon den XML-Quelltext.

Code: Alles auswählen

 
  uses SAX, DOM, XMLRead, SAX_HTML, xpath, XMLWrite;     
 
  :
  :
 
  fOutStream := TMemoryStream.Create;
  try
    // important: Stream could have another position than 0 bfrom former operations
    fInStream.Seek(0, 0);
 
    ReadXMLFile(fDomDoc, fInStream);
    WriteXMLFile(fDomDoc, fOutStream);
 
    fOutStream.SaveToFile('test.html');
  finally
    FreeAndNil(fOutStream);
  end;           
Grüße, Antrepolit

care only if your os is really burning

BeniBela
Beiträge: 321
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Bug in Unit sax_html.pas?

Beitrag von BeniBela »

Oh, html in Lazarus ist völlig kaputt.

Ich habe es aufgegeben, und meinen eigenen Parser geschrieben. Der geht zwar auch nicht immer (basiert noch auf html4 statt html5), ist aber deutlich besser

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Bug in Unit sax_html.pas?

Beitrag von Antrepolit »

BeniBela hat geschrieben:Oh, html in Lazarus ist völlig kaputt.

Ich habe es aufgegeben, und meinen eigenen Parser geschrieben. Der geht zwar auch nicht immer (basiert noch auf html4 statt html5), ist aber deutlich besser
Leider beobachte auch ich in der letzten Zeit eine starke Anhäufung von Fehlern und Problemen in der IDE (gerade bei HTML). Es kann aber nicht die Lösung sein, das Rad neu zu erfinden. Ich werde den Bug aufmachen. Und ein Parser, der HTML5 nicht verträgt, beraubt sich ja selbst seiner Existenzberechtigung. Web-Designer springen bekanntlich immer auf das neuste und schönste Pferd, können nur leider nie so toll reiten. :wink: Die Fehlerfreiheit von Webseiten existiert ohnehin fast nur noch in der Theorie; Konventionen jedenfalls werde fast nie eingehalten. Darum ist ein selbstgebastelter Parser kaum geeignet. Abgesehen davon, dass ich die Zeit nicht habe.

Hatte davor mit SAX improvisiert - da wird das Tag korrekt erkannt. Das Problem muss in der Konvertierung liegen. Leider konnte ich es noch nicht genauer eingrenzen, was aber vor dem Erstellen eines Bugreports nötig sein dürfte...
Grüße, Antrepolit

care only if your os is really burning

BeniBela
Beiträge: 321
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Bug in Unit sax_html.pas?

Beitrag von BeniBela »

Antrepolit hat geschrieben: Leider beobachte auch ich in der letzten Zeit eine starke Anhäufung von Fehlern und Problemen in der IDE (gerade bei HTML).
In letzter Zeit ist es eigentlich besser geworden.

Vor 5 Jahren war es fürchterlich, da haben noch nicht mal die xml-Funktionen vernünftig funktioniert.
Antrepolit hat geschrieben: Es kann aber nicht die Lösung sein, das Rad neu zu erfinden. Ich werde den Bug aufmachen.
Html5 definiert den Parsingvorgang vollständig neu.

Jeder Parser (außer denen von denen der Algorithmus erst übernommen wurde) muss neugeschrieben werden.
Antrepolit hat geschrieben: Hatte davor mit SAX improvisiert - da wird das Tag korrekt erkannt. Das Problem muss in der Konvertierung liegen
Wenn die Unit wirklich SAX verwendet, ist das schon das erste Problem. SAX kann nicht wirklich verwendet werden, um damit html zu parsen.

Antworten