Niniejszy moduł omawia moduł html.parser z biblioteki standardowej Pythona 3 – strumieniowy analizator HTML oparty na modelu zdarzeń. Poznamy sposób działania parsera, rozszerzanie go przez dziedziczenie, obsługę wywołań zwrotnych, a także praktyczne zastosowania (ekstrakcja linków, zliczanie tagów). Na koniec omówimy ograniczenia HTMLParser i porównamy go z alternatywami.
Każdy temat umieszczony jest w osobnym podkatalogu zawierającym:
README.md– wyczerpujące omówienie koncepcji, fragmenty kodu, diagramy i referencjediagrams/– pliki PlantUML (.puml) ilustrujące omawiane zagadnieniaexamples/– uruchamialne skrypty Python 3exercises/– zadania do samodzielnego rozwiązania, przykładowe rozwiązania i testy
| Katalog | Temat | Kluczowe zagadnienia |
|---|---|---|
| 01-streaming-parser-events/ | Analizator strumieniowy i zdarzenia | HTMLParser, feed(), model SAX-like, tokenizacja HTML |
| 02-subclassing/ | Rozszerzanie parsera | Dziedziczenie po HTMLParser, wzorzec Template Method, __init__, reset |
| 03-event-handling/ | Obsługa zdarzeń i wywołania zwrotne | handle_starttag, handle_endtag, handle_data, handle_comment, handle_decl |
| 04-link-extraction/ | Ekstrakcja linków (szczegółowo) | Wyciąganie href/src, normalizacja URL, filtrowanie, kompletny przykład |
| 05-tag-counting/ | Zliczanie tagów | Histogram tagów, collections.Counter, głębokość zagnieżdżenia |
| 06-limitations-and-alternatives/ | Ograniczenia i alternatywy | Malformed HTML, brak DOM/CSS, BeautifulSoup, lxml, porównanie |
Python >= 3.10
pytest >= 7.4
plantuml # do wizualizacji diagramów .puml (pip install plantuml)
html.parserjest częścią biblioteki standardowej – nie wymaga instalacji zewnętrznych pakietów. Temat 06 (alternatywy) korzysta opcjonalnie zbeautifulsoup4ilxml.
# Przykłady
python src/_07-html-parser/01-streaming-parser-events/examples/streaming_demo.py
python src/_07-html-parser/02-subclassing/examples/custom_parser.py
python src/_07-html-parser/03-event-handling/examples/callbacks_demo.py
python src/_07-html-parser/04-link-extraction/examples/link_extractor.py
python src/_07-html-parser/05-tag-counting/examples/tag_counter.py
python src/_07-html-parser/06-limitations-and-alternatives/examples/alternatives_demo.py
# Testy (wszystkie)
python -m pytest src/_07-html-parser/ -v
# Testy pojedynczego tematu
python -m pytest src/_07-html-parser/01-streaming-parser-events/exercises/test_solutions.py -v
python -m pytest src/_07-html-parser/02-subclassing/exercises/test_solutions.py -v
python -m pytest src/_07-html-parser/03-event-handling/exercises/test_solutions.py -v
python -m pytest src/_07-html-parser/04-link-extraction/exercises/test_solutions.py -v
python -m pytest src/_07-html-parser/05-tag-counting/exercises/test_solutions.py -v
python -m pytest src/_07-html-parser/06-limitations-and-alternatives/exercises/test_solutions.py -v| Temat | Zakres zadań |
|---|---|
| 01-streaming-parser-events | zliczanie zdarzeń, wykrywanie zamknięcia tagów, karmienie fragmentami |
| 02-subclassing | klasa zbierająca nagłówki, ekstraktor atrybutów src z <img> |
| 03-event-handling | ekstrakcja komentarzy, zbieranie tekstu, mapowanie atrybutów |
| 04-link-extraction | wyciąganie linków <a>, filtrowanie URL zewnętrznych, ekstrakcja z <img> |
| 05-tag-counting | histogram tagów, najczęstszy tag, maksymalna głębokość zagnieżdżenia |
| 06-limitations-and-alternatives | naprawa malformed HTML, porównanie z BeautifulSoup |
| Diagram | Opis | Plik |
|---|---|---|
| Przepływ zdarzeń | Sekwencja: feed() → tokenizer → callbacks |
01-streaming-parser-events/diagrams/streaming_events.puml |
| Hierarchia klas | Diagram klas: HTMLParser ← podklasa użytkownika |
02-subclassing/diagrams/subclass_hierarchy.puml |
| Dispatch callbacków | Aktywność: typ tokenu → odpowiedni callback | 03-event-handling/diagrams/callback_dispatch.puml |
| Przepływ ekstrakcji | Flowchart ekstrakcji linków z HTML | 04-link-extraction/diagrams/link_extraction_flow.puml |
| Zliczanie tagów | Przepływ budowania histogramu tagów | 05-tag-counting/diagrams/tag_counter_flow.puml |
| Porównanie parserów | Tabela: HTMLParser vs BS4 vs lxml | 06-limitations-and-alternatives/diagrams/comparison_table.puml |