3 releases
0.1.2 | Nov 16, 2024 |
---|---|
0.1.1 | Nov 13, 2024 |
0.1.0 | Nov 13, 2024 |
#431 in Text processing
111 downloads per month
22KB
252 lines
HTML Parser Tarasenko
Опис
Цей проект є базовим HTML-парсером, написаним на Rust із використанням Pest
для синтаксичного аналізу. Парсер розбирає HTML-документи, виділяючи основні компоненти, такі як теги, атрибути та текстові вузли, створюючи деревоподібну структуру для представлення розмітки HTML.
Мета проекту
Метою цього проекту є створення синтаксичного аналізатора, здатного розпізнавати HTML-структури, включаючи вкладені елементи, атрибути тегів, текстові вузли, а також перевіряти правильність відкриття і закриття тегів.
Технічний опис синтаксичного аналізу
Що саме аналізується
Парсер аналізує наступні основні компоненти HTML-документа:
- Теги елементів: Відкриваючі та закриваючі теги розбираються як єдині вузли в дереві синтаксичного аналізу. Наприклад, тег
<div>
розпізнається як елемент із вкладеними дочірніми елементами, тоді як самозакриваючі теги на кшталт<img />
обробляються окремо. - Атрибути тегів: Кожен тег може містити атрибути, записані у форматі
name="value"
. Вони додаються до відповідного елемента як список пар "ім'я-значення". - Вкладені елементи: Парсер підтримує вкладення елементів, що дозволяє розбирати HTML-структури будь-якої глибини, наприклад,
<div><p><span>Text</span></p></div>
. - Текстові вузли: Будь-який текст між тегами обробляється як текстовий вузол і додається як дочірній елемент відповідного батьківського вузла.
Процес аналізу
Синтаксичний аналіз здійснюється за допомогою граматики, визначеної у файлі HTML.pest
, яка розділяє HTML-код на основні компоненти: element
, self_closing_element
, attribute
, text
тощо. Граматика побудована таким чином, щоб дозволити рекурсивну обробку вкладених тегів.
Для забезпечення коректності структури HTML, після парсингу відбувається валідація збігу імен у відкриваючих і закриваючих тегах. Наприклад, для <div>...</div>
парсер перевірить, що ім'я тега в кінцевому тегу відповідає імені в початковому. Якщо відбувається помилка (наприклад, <div>...</span>
), програма повертає повідомлення про помилку.
Використання результатів аналізу
Результати синтаксичного аналізу зберігаються у вигляді дерева, де кожен вузол представляє HTML-елемент із потенційними дочірніми елементами. Дерево може бути використане для різних цілей:
- Генерація або модифікація HTML: Оброблене дерево можна перетворити назад у HTML або модифікувати, додаючи чи видаляючи вузли.
- Конвертація у формат XML або JSON: Це дозволяє імпортувати HTML-контент у програми, які працюють із структурованими даними.
- Аналіз вмісту HTML: Можливість обробляти та витягувати текстові та атрибутивні дані дозволяє використовувати парсер для аналітичних задач, таких як аналіз контенту або пошук певних елементів.
Граматика
-
html = { SOI ~ elements ~ EOI }
-
elements = { (element | self_closed_tag)* }
-
element = { opening_tag ~ content ~ closing_tag }
-
opening_tag = { "<" ~ tag_name ~ attribute_list ~ ">" }
-
closing_tag = { "</" ~ tag_name ~ ">" }
-
self_closed_tag = { "<" ~ tag_name ~ attribute_list ~ "/>" }
-
tag_name = @{ ASCII_ALPHA+ ~ ASCII_DIGIT? }
-
attribute_list = { attribute* }
-
attribute = { identifier ~ "=" ~ quoted_string }
-
identifier = { ASCII_ALPHA+ }
-
quoted_string = { """ ~ (!""" ~ ANY)* ~ """ }
-
content = { (element | text | self_closed_tag)* }
-
text = @{ (!"<" ~ ANY)+ }
-
WHITESPACE = _{ " " | "\t" | "\n" | "\r" }
Як використовувати
cargo run --release -- parse <Назва файлу>
Crate
Dependencies
~3.5–4.5MB
~89K SLoC