HTML Bộ phân tích từ
HTML Bộ phân tích từ
Trình tách token là giai đoạn đầu tiên của quá trình phân tích HTML: nó chuyển đổi văn bản markup thành một luồng các token được định nghĩa theo tiêu chuẩn. Nó là API công cộng, vì vậy các công cụ quan tâm đến token hơn là cây — các trình kiểm tra cú pháp, các bước tiền xử lý làm sạch, các bộ tô sáng cú pháp — có thể tiêu thụ luồng này trực tiếp.
Tách Token Markup
Tokenizer.tokenize() xử lý toàn bộ đầu vào; Tokenizer.tokenize_fragment() áp dụng các quy tắc tách token cho đoạn. Cả hai đều phát ra từ vựng token chuẩn.
Các lớp Token
Mỗi token là một đối tượng có kiểu: StartTagToken và EndTagToken cho thẻ (kèm thuộc tính), CharacterToken cho văn bản, CommentToken, DoctypeToken, và EofToken đánh dấu kết thúc đầu vào.
Các trạng thái Tokenizer
TokenizerState mô phỏng máy trạng thái tiêu chuẩn — cùng các trạng thái mà đặc tả đặt tên — và Tokenizer.set_state() cho phép các đoạn và người gọi nhạy cảm ngữ cảnh bắt đầu ở trạng thái đúng.
Tham chiếu ký tự
Các tham chiếu ký tự có tên và số được giải quyết thông qua resolve_named_char_ref(), resolve_numeric_char_ref() và find_named_char_ref_match() — bảng tham chiếu có tên đầy đủ, không phải một tập hợp rút gọn.
Mẹo và Thực tiễn tốt nhất
- Sử dụng
tokenize_fragment()với trạng thái khởi đầu đúng khi phân tích token nội dung sẽ xuất hiện bên trong một phần tử cụ thể - Xem
EofTokennhư tín hiệu kết thúc cuối cùng thay vì làm cạn iterator bằng ngoại lệ - Đối với các bộ làm sạch, kiểm tra các thuộc tính
StartTagTokenở mức token trước khi xây dựng bất kỳ cây nào
Các vấn đề thường gặp
| Vấn đề | Nguyên nhân | Sửa lỗi |
|---|---|---|
| Nội dung script/style được tách thành markup | Sai trạng thái ban đầu cho ngữ cảnh | Đặt TokenizerState phù hợp thông qua set_state() |
| Các thực thể xuất hiện chưa được giải quyết | Tiêu thụ văn bản thô mà không giải quyết tham chiếu | Sử dụng các hàm giải quyết char-ref |
| Đầu ra fragment khác với phân tích toàn bộ | Quy tắc fragment cố ý khác nhau | Sử dụng tokenize() cho tài liệu đầy đủ |
FAQ
Tôi có thể sử dụng bộ tokenizer mà không xây dựng cây không?
Có — luồng token là đầu ra công khai, độc lập.
Các trạng thái của tokenizer có phải là các trạng thái tiêu chuẩn không?
TokenizerState phản chiếu máy trạng thái của đặc tả và có thể được đặt qua set_state().
Các tham chiếu ký tự có tên được xử lý như thế nào?
Thông qua resolve_named_char_ref() và find_named_char_ref_match() dựa trên bảng tham chiếu ký tự có tên đầy đủ.
API Reference Tóm tắt
| Lớp/Phương thức | Mô tả |
|---|---|
Tokenizer.tokenize | Tokenize toàn bộ đầu vào |
Tokenizer.tokenize_fragment | Token hoá theo quy tắc fragment |
Tokenizer.set_state | Đặt trạng thái tokenizer ban đầu |
StartTagToken | Token thẻ bắt đầu với các thuộc tính |
TokenizerState | Các trạng thái của máy trạng thái tiêu chuẩn |
resolve_named_char_ref | Giải quyết một tham chiếu ký tự có tên |