HTML ตัวแยกโทเคน
HTML Tokenizer
ตัวแยกโทเค็นเป็นขั้นตอนแรกของการพาร์ส HTML: มันแปลงข้อความมาร์คอัปเป็นสตรีมของโทเค็นที่กำหนดโดยมาตรฐาน. มันเป็น API สาธารณะ, ดังนั้นเครื่องมือที่สนใจโทเค็นมากกว่าต้นไม้ — ลินท์เตอร์, การผ่านล่วงหน้าของ sanitizer, ไฮไลท์ไวยากรณ์ — สามารถรับสตรีมนี้โดยตรง.
การแยกโทเค็นมาร์คอัป
Tokenizer.tokenize() ประมวลผลอินพุตทั้งหมด; Tokenizer.tokenize_fragment() ใช้กฎการแยกโทเค็นของส่วนย่อย. ทั้งสองส่งออกคำศัพท์โทเค็นมาตรฐาน.
คลาสโทเค็น
แต่ละโทเค็นเป็นอ็อบเจ็กต์ที่มีประเภท: StartTagToken และ EndTagToken สำหรับแท็ก (พร้อมแอตทริบิวต์), CharacterToken สำหรับข้อความ, CommentToken, DoctypeToken, และ EofToken ระบุจุดสิ้นสุดของอินพุต.
สถานะ Tokenizer
TokenizerState จำลองเครื่องสถานะมาตรฐาน — สถานะเดียวกับที่สเปคกำหนดไว้ — และ Tokenizer.set_state() ทำให้ผู้เรียกแบบ fragment และแบบตามบริบทเริ่มต้นในสถานะที่ถูกต้อง.
อ้างอิงอักขระ
อ้างอิงอักขระแบบตั้งชื่อและเชิงตัวเลขจะถูกแก้ไขผ่าน resolve_named_char_ref(), resolve_numeric_char_ref() และ find_named_char_ref_match() — ตารางอ้างอิงแบบตั้งชื่อเต็มรูปแบบ ไม่ใช่ชุดย่อยแบบลัด.
เคล็ดลับและแนวทางปฏิบัติที่ดีที่สุด
- ใช้
tokenize_fragment()พร้อมสถานะเริ่มต้นที่ถูกต้องเมื่อทำการแยกโทเคนเนื้อหาที่จะปรากฏภายในองค์ประกอบเฉพาะ - ถือว่า
EofTokenเป็นสัญญาณจบที่แน่นอน แทนที่จะทำให้ตัววนซ้ำหมดโดยการโยนข้อยกเว้น - สำหรับตัวทำความสะอาด ให้ตรวจสอบแอตทริบิวต์ของ
StartTagTokenในระดับโทเคน ก่อน ที่จะสร้างต้นไม้ใด ๆ
ปัญหาทั่วไป
| ปัญหา | สาเหตุ | แก้ไข |
|---|---|---|
| เนื้อหา script/style ถูกแยกโทเคนเป็น markup | สถานะเริ่มต้นที่ไม่ถูกต้องสำหรับ context | ตั้งค่า TokenizerState ที่เหมาะสมผ่าน set_state() |
| Entities ปรากฏว่าไม่ได้รับการแก้ไข | การใช้ข้อความดิบโดยไม่มีการแก้ไข reference resolution | ใช้ฟังก์ชันตัวแก้ไขอักขระอ้างอิง |
| ผลลัพธ์ของส่วนแตกต่างจากการแยกวิเคราะห์เต็ม | กฎของส่วนถูกตั้งใจให้แตกต่าง | ใช้ tokenize() สำหรับเอกสารเต็ม |
FAQ
ฉันสามารถใช้ตัวแยกโทเคนโดยไม่ต้องสร้างต้นไม้ได้หรือไม่?
ใช่ — สตรีมโทเคนเป็นผลลัพธ์สาธารณะที่ทำงานแยกอิสระ.
สถานะของตัวแยกโทเคนเป็นมาตรฐานหรือไม่?
TokenizerState สะท้อนเครื่องจักรสถานะของสเปคและสามารถตั้งค่าได้ผ่าน set_state().
การอ้างอิงอักขระที่ตั้งชื่อถูกจัดการอย่างไร?
ผ่าน resolve_named_char_ref() และ find_named_char_ref_match() กับตารางอ้างอิงที่ตั้งชื่อเต็มรูปแบบ.
API Reference สรุป
| คลาส/เมธอด | คำอธิบาย |
|---|---|
Tokenizer.tokenize | ทำการแยกโทเคนอินพุตทั้งหมด |
Tokenizer.tokenize_fragment | แยกโทเคนด้วยกฎส่วนย่อย |
Tokenizer.set_state | ตั้งค่าสถานะเริ่มต้นของ tokenizer |
StartTagToken | โทเคนแท็กเริ่มต้นพร้อมแอตทริบิวต์ |
TokenizerState | มาตรฐานสถานะของเครื่องสถานะ |
resolve_named_char_ref | แก้ไขการอ้างอิงอักขระที่ตั้งชื่อ |