HTML Tokenizator
HTML Tokenizator
Tokenizator jest pierwszym etapem parsowania HTML: konwertuje tekst znaczników na strumień tokenów zdefiniowanych w standardach. Jest publicznie API, więc narzędzia, które interesują się tokenami zamiast drzew — lintery, wstępne fazy sanitizera, podświetlacze składni — mogą bezpośrednio konsumować ten strumień.
Tokenizacja znaczników
Tokenizer.tokenize() przetwarza pełne wejście; Tokenizer.tokenize_fragment() stosuje reguły tokenizacji fragmentów. Oba emitują standardowy słownik tokenów.
Klasy tokenów
Każdy token jest obiektem typowanym: StartTagToken i EndTagToken dla znaczników (z atrybutami), CharacterToken dla tekstu, CommentToken, DoctypeToken oraz EofToken oznaczające koniec wejścia.
Stany tokenizatora
TokenizerState modeluje maszynę stanów standardów — te same stany, które wymienia specyfikacja — a Tokenizer.set_state() pozwala fragmentom i wywołującym wrażliwym na kontekst rozpocząć w odpowiednim stanie.
Odwołania znakowe
Nazwane i numeryczne odwołania znakowe są rozwiązywane przez resolve_named_char_ref(), resolve_numeric_char_ref() i find_named_char_ref_match() — pełną tabelę nazwanych odwołań, a nie podzbiór skrócony.
Wskazówki i najlepsze praktyki
- Użyj
tokenize_fragment()z poprawnym stanem początkowym podczas tokenizacji treści, która pojawiłaby się wewnątrz konkretnego elementu - Traktuj
EofTokenjako ostateczny sygnał zakończenia, zamiast wyczerpywać iterator przez wyjątek - Dla sanitizatorów, sprawdź atrybuty
StartTagTokenna poziomie tokenu przed zbudowaniem jakiegokolwiek drzewa
Typowe problemy
| Problem | Przyczyna | Naprawa |
|---|---|---|
| Zawartość skryptu/stylu jest tokenizowana jako znacznik | Nieprawidłowy początkowy stan kontekstu | Ustaw odpowiedni TokenizerState za pomocą set_state() |
| Encje wydają się nierozwiązane | Konsumowanie surowego tekstu bez rozwiązywania referencji | Użyj funkcji rozwiązywania referencji znakowych |
| Wynik fragmentu różni się od pełnego parsowania | Reguły fragmentu celowo się różnią | Użyj tokenize() dla pełnych dokumentów |
FAQ
Czy mogę używać tokenizera bez budowania drzewa?
Tak — strumień tokenów jest publicznym, samodzielnym wyjściem.
Czy stany tokenizera są standardowe?
TokenizerState odzwierciedla maszynę stanów specyfikacji i jest ustawialny za pomocą set_state().
Jak obsługiwane są nazwane odniesienia znakowe?
Poprzez resolve_named_char_ref() i find_named_char_ref_match() względem pełnej tabeli nazwanych odniesień.
API Reference Podsumowanie
| Klasa/Metoda | Opis |
|---|---|
Tokenizer.tokenize | Tokenizuj pełne wejście |
Tokenizer.tokenize_fragment | Tokenizuj z regułami fragmentu |
Tokenizer.set_state | Ustaw początkowy stan tokenizera |
StartTagToken | Token znacznika początkowego z atrybutami |
TokenizerState | Stany maszyny stanowej standardów |
resolve_named_char_ref | Rozwiąż nazwane odwołanie znakowe |