Schreiben eines HTML-Parsers

Lesezeit: 7 Minuten

Benutzer-Avatar
James

Ich versuche derzeit (oder plane zu versuchen), ein einfaches (möglichst) Programm zu schreiben, um ein HTML-Dokument in einen Baum zu zerlegen.

Nachdem ich gegoogelt habe, habe ich viele Antworten gefunden, die sagen: “Tu es nicht, es wurde getan” (oder Worte in diesem Sinne); und Verweise auf Beispiele von HTML-Parsern; und auch ein ziemlich nachdrücklicher Artikel darüber, warum man keine regulären Ausdrücke verwenden sollte. Ich habe jedoch keine Anleitungen zum “richtigen” Schreiben eines Parsers gefunden. (Dies ist übrigens etwas, das ich eher als Lernübung versuche, also würde ich es gerne tun, anstatt eine vorgefertigte zu verwenden.)

Ich glaube, ich könnte einen funktionierenden XML-Parser erstellen, indem ich einfach das Dokument lese und die Tags/Texte usw. zum Baum hinzufüge und jedes Mal, wenn ich auf ein schließendes Tag treffe, eine Stufe höher steige (wiederum einfach, in diesem Stadium sind keine ausgefallenen Threads oder Effizienz erforderlich). .). Bei HTML sind jedoch nicht alle Tags geschlossen.

Meine Frage ist also: Was würden Sie empfehlen, um damit umzugehen? Die einzige Idee, die ich hatte, war, es ähnlich wie XML zu behandeln, aber eine Liste von Tags zu haben, die nicht unbedingt geschlossen sind, jeweils mit Bedingungen für das Schließen (z. B.

endet auf

oder als nächstes

Etikett).

Hat jemand andere (hoffentlich bessere) Vorschläge? Gibt es einen besseren Weg, dies insgesamt zu tun?

  • Tu es nicht! Aber das wirst du sowieso. Also schau mal jsoup.org

    – Lukas Eder

    25. August 2011 um 14:28 Uhr


  • das klingt nach einer unterhaltsamen Übung. weiter versuchen

    – Einácio

    25. August 2011 um 14:32 Uhr

  • Nur zur Erinnerung, Sie müssen sich um mehr als nur Tags kümmern, die sich nicht selbst schließen, Sie haben auch implizite öffnende Tags ( ist optional), plus das ganze Durcheinander von schlecht geformtem HTML-Code, der HTML ist Parser bewältigen. Die HTML5-Spezifikation enthält einen ziemlich spezifischen Parsing-Algorithmus.

    – Matthäus Wilson

    25. August 2011 um 14:36 ​​Uhr

  • Warum willst du kein vorhandenes verwenden?

    – Jantimon

    25. August 2011 um 14:36 ​​Uhr

  • Eine sehr edle Übung 🙂 Mein Vorschlag wäre, sich den Quellcode eines vorhandenen Parsers in Ihrer Lieblingssprache anzusehen.

    –Richard H

    25. August 2011 um 14:41 Uhr

Der Lockerheit von HTML kann Rechnung getragen werden, indem die fehlenden Open- und Close-Tags nach Bedarf ermittelt werden. Dies ist im Wesentlichen das, was ein Validator wie Tidy tut.

Sie behalten einen Stapel (möglicherweise implizit mit einem Baum) des aktuellen Kontexts. Zum Beispiel, {<html>, <body>} bedeutet, dass Sie sich gerade im Hauptteil des HTML-Dokuments befinden. Wenn Sie auf einen neuen Knoten stoßen, vergleichen Sie die Anforderungen für diesen Knoten mit dem, was sich derzeit auf dem Stack befindet.

Angenommen, Ihr Stack ist derzeit nur {html}. Du begegnest einem <p> Schild. Du siehst auf <p> in einer Tabelle, die Ihnen sagt, dass sich ein Absatz innerhalb des befinden muss <body>. Da du nicht im Körper bist, drückst du implizit <body> auf Ihren Stack (oder fügen Sie Ihrem Baum einen Body-Knoten hinzu). Dann kannst du die setzen <p> in den Baum.

Angenommen, Sie sehen jetzt einen anderen <p>. Ihre Regeln sagen Ihnen, dass Sie keinen Absatz innerhalb eines Absatzes verschachteln können, also wissen Sie, dass Sie den Strom platzen lassen müssen <p> vom Stapel (als ob Sie ein Schließen-Tag gesehen hätten), bevor Sie den neuen Absatz auf den Stapel schieben.

Am Ende Ihres Dokuments entfernen Sie jedes verbleibende Element von Ihrem Stapel, als ob Sie für jedes ein Schließen-Tag gesehen hätten.

Der Trick besteht darin, eine gute Möglichkeit zu finden, die Kontextanforderungen für jedes Element darzustellen.

  • Dies ist näher, das bedeutet, dass das HTML-Parsen viel mehr umfasst als das XML-Parsen und das Reparieren einiger schlampiger Tags

    – Duckduckgo

    25. Februar 2014 um 4:12 Uhr

also versuche ich hier eine Antwort –

Im Grunde unterscheidet sich das “einfache” HTML-Parsing (wobei hier nicht von gültigem XHTML gesprochen wird) vom XML-Parsing durch eine Menge Regeln wie “unendlich”. <img>-Tags oder, genau genommen, die Tatsache, dass selbst die schlampigsten aller HTML-Markups in einem Browser einigermaßen gerendert werden. Sie benötigen zusammen mit dem Parser einen Validator, um Ihren Baum zu erstellen. Aber Sie müssen sich für einen HTML-Standard entscheiden, den Sie unterstützen möchten, damit Sie, wenn Sie auf eine Schwäche im Markup stoßen, wissen, dass es sich um einen Fehler und nicht nur um schlampiges HTML handelt.

Kennen Sie alle Regeln, bauen Sie einen Validator, und dann werden Sie in der Lage sein, einen Parser zu bauen. das ist Plan A.

Plan B wäre, Ihrem Parser eine gewisse Fehlerresistenz einzuräumen, was den Validierungsschritt überflüssig machen würde. Analysieren Sie beispielsweise alle Tags und fügen Sie sie in eine Liste ein, wobei Sie alle Attribute weglassen, damit Sie die Liste problemlos bearbeiten und feststellen können, ob ein Tag offen gelassen oder überhaupt nie geöffnet wurde, um schließlich ein „gut“ zu erhalten ” Layoutbaum, der eine ungefähre Lösung für ein schlampiges Layout darstellt, während er für ein korrektes Layout genau ist.

hoffe das hat geholfen!

  • Das ist wirklich nützlich. Ich hatte nicht daran gedacht, sie in eine solche Liste aufzunehmen und diese als Grundlage für den Baum zu verwenden (ich dachte, es müsste auf einmal erledigt werden, es kam mir nicht in den Sinn, mehrere Durchgänge über das Dokument zu machen) . Danke ^^

    – James

    25. August 2011 um 15:09 Uhr

Da es nun den html5-Standard gibt, ist das Schreiben eines HTML-Parsers kein Trial-and-Error oder obskures Wissen mehr.

Stattdessen müssen Sie nur das Standardisierte implementieren Parsing-Algorithmus.

Benutzer-Avatar
DwB

Harsch. gehen

HTML ist nicht XML. XHTML ist XML. Die meisten Websites sind HTML; einige sind XHTML. In XHTML müssen alle Tags geschlossen sein (oder keinen Körper haben, der noch geschlossen ist).

Wenn Sie einen HTML-Parser als Lernexperiment schreiben wollen, dann tun Sie es. Wenn Sie den nächsten “Greaterest HTML Parser” schreiben wollen, dann geben Sie es auf. Apache (oder jemand anderes) gewinnt; Die wichtige Information ist: Sie wissen nicht mehr als die großen Gruppen, die sich auf das Parsen von HTML spezialisiert haben.

Zur Beantwortung der Frage “Wie gehe ich damit um?” Lesen Sie die W3C-Spezifikation zu HTML. Es beantwortet Ihre Frage. Wenn Ihre Antwort “aber ich will auch nicht” lautet, dann sagen Sie eigentlich “Ich bin ein fauler Trottel, der so tun möchte, als würde er lernen”. Wenn das der Fall ist, schlage ich vor, dass Sie den Beitrag löschen und weitermachen; Das Microsoft IE-Team hat wahrscheinlich einige Dokumente, die Sie interessieren werden.

Weniger harte Antwort

HTML ist nicht einfach zu analysieren. Im einfachsten Fall benötigen Sie keine Head- oder Body-Elemente und viele Tags müssen nicht geschlossen werden. Eine Grundregel beim Parsen von HTML ist Wenn Sie auf ein neues Blockelement stoßen, schließen Sie automatisch das vorherige Blockelement. Sie können dafür keinen Standard-XML-Parser verwenden, da HTML nicht XML ist.

Ähnlich wie bei XML müssen Sie Ihr Dokument in Elemente aufteilen, einschließlich Freitextelemente.

XHTML ist viel einfacher, weil es wohlgeformtes XML sein muss. Dazu können Sie einen XML-Parser verwenden.

Fast ein Jahrzehnt zu spät, aber egal. Wenn es für Sie nicht relevant ist, ist es für zukünftige Besucher.

Eine andere Möglichkeit wäre die Vorgaben umsetzen.

Das WASWG hat eine Norm Spezifikation für HTML. Dabei ist an alle Macken gedacht, und Sie können sicher sein, einige seltsame HTML-Mechaniken nicht vergessen zu haben (es gibt viele).

Die Spezifikation enthält auch den Abschnitt § 13.2 Parsen von HTML-Dokumentenwo es umreißt, wie ein Benutzeragent (Ihr Parser) ein HTML-Dokument in eine DOM-Baum. An alle Grenzfälle ist bereits gedacht. Der schwierigste Teil besteht darin, die richtigen Datenstrukturen und den richtigen Programmfluss in der Sprache Ihrer Wahl zu verwenden, um sie zu implementieren.

Viel Glück und behalte deinen Geist, Leser!

Benutzer-Avatar
Schuld

Haben Sie versucht, diese Bibliothek zu verwenden: http://simplehtmldom.sourceforge.net/ ?

F.

1143340cookie-checkSchreiben eines HTML-Parsers

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy