HTML Tokenizer
HTML Tokenizer
Der Tokenizer ist die erste Stufe der HTML-Analyse: Er wandelt Markup-Text in einen Strom von standarddefinierten Tokens um. Er ist öffentlich API, sodass Werkzeuge, die Tokens statt Bäumen interessieren — Linter, Sanitizer-Vorläufe, Syntax-Highlighter — den Strom direkt konsumieren können.
Tokenisierung von Markup
Tokenizer.tokenize() verarbeitet die komplette Eingabe; Tokenizer.tokenize_fragment() wendet Fragment-Tokenisierungsregeln an. Beide erzeugen den Standard-Token-Wortschatz.
Token-Klassen
Jedes Token ist ein typisiertes Objekt: StartTagToken und EndTagToken für Tags (mit Attributen), CharacterToken für Text, CommentToken, DoctypeToken und EofToken markieren das Ende der Eingabe.
Tokenizer-Zustände
TokenizerState modelliert die Statusmaschine der Standards — dieselben Zustände, die die Spezifikation nennt — und Tokenizer.set_state() ermöglicht fragment- und kontextsensitiven Aufrufern, im richtigen Zustand zu starten.
Zeichenreferenzen
Benannte und numerische Zeichenreferenzen werden über resolve_named_char_ref(), resolve_numeric_char_ref() und find_named_char_ref_match() aufgelöst — die vollständige benannte Referenztabelle, nicht ein verkürztes Subset.
Tipps und bewährte Verfahren
- Verwenden Sie
tokenize_fragment()mit dem korrekten Anfangszustand, wenn Sie Inhalte tokenisieren, die innerhalb eines bestimmten Elements erscheinen würden. - Betrachten Sie
EofTokenals das endgültige Endsignal, anstatt den Iterator durch Ausnahmen zu erschöpfen. - Für Sanitizer prüfen Sie die
StartTagToken-Attribute auf Token-Ebene, bevor ein Baum aufgebaut wird.
Häufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| Skript/Style-Inhalt wird als Markup tokenisiert | Falscher Anfangszustand für den Kontext | Setzen Sie das passende TokenizerState über set_state() |
| Entitäten bleiben ungelöst | Verarbeitung von Rohtext ohne Referenzauflösung | Verwenden Sie die Char-Ref-Auflösungsfunktionen |
| Fragmentausgabe unterscheidet sich vom vollständigen Parsing | Fragmentregeln unterscheiden sich absichtlich | Verwenden Sie tokenize() für vollständige Dokumente |
FAQ
Kann ich den Tokenizer verwenden, ohne einen Baum zu bauen?
Ja — der Token-Stream ist eine öffentliche, eigenständige Ausgabe.
Sind die Tokenizer-Zustände die Standardzustände?
TokenizerState spiegelt die Zustandsmaschine der Spezifikation und ist über set_state() einstellbar.
Wie werden benannte Zeichenreferenzen behandelt?
Durch resolve_named_char_ref() und find_named_char_ref_match() anhand der vollständigen benannten Referenztabelle.
API Reference Zusammenfassung
| Klasse/Methode | Beschreibung |
|---|---|
Tokenizer.tokenize | Tokenisieren Sie die komplette Eingabe |
Tokenizer.tokenize_fragment | Tokenisieren mit Fragmentregeln |
Tokenizer.set_state | Legt den anfänglichen Tokenizer-Zustand fest |
StartTagToken | Start-Tag-Token mit Attributen |
TokenizerState | Zustände der Zustandsmaschine nach Standards |
resolve_named_char_ref | Eine benannte Zeichenreferenz auflösen |