#html-parser #pest #на #використанням #tarasenko #html-парсер #базовий

bin+lib html_parser_tarasenko

Базовий HTML-парсер на Rust з використанням Pest

3 releases

0.1.2 Nov 16, 2024
0.1.1 Nov 13, 2024
0.1.0 Nov 13, 2024

#431 in Text processing

Download history 290/week @ 2024-11-11 53/week @ 2024-11-18 26/week @ 2024-12-09

111 downloads per month

MIT license

22KB
252 lines

HTML Parser Tarasenko

Опис

Цей проект є базовим HTML-парсером, написаним на Rust із використанням Pest для синтаксичного аналізу. Парсер розбирає HTML-документи, виділяючи основні компоненти, такі як теги, атрибути та текстові вузли, створюючи деревоподібну структуру для представлення розмітки HTML.

Мета проекту

Метою цього проекту є створення синтаксичного аналізатора, здатного розпізнавати HTML-структури, включаючи вкладені елементи, атрибути тегів, текстові вузли, а також перевіряти правильність відкриття і закриття тегів.

Технічний опис синтаксичного аналізу

Що саме аналізується

Парсер аналізує наступні основні компоненти HTML-документа:

  1. Теги елементів: Відкриваючі та закриваючі теги розбираються як єдині вузли в дереві синтаксичного аналізу. Наприклад, тег <div> розпізнається як елемент із вкладеними дочірніми елементами, тоді як самозакриваючі теги на кшталт <img /> обробляються окремо.
  2. Атрибути тегів: Кожен тег може містити атрибути, записані у форматі name="value". Вони додаються до відповідного елемента як список пар "ім'я-значення".
  3. Вкладені елементи: Парсер підтримує вкладення елементів, що дозволяє розбирати HTML-структури будь-якої глибини, наприклад, <div><p><span>Text</span></p></div>.
  4. Текстові вузли: Будь-який текст між тегами обробляється як текстовий вузол і додається як дочірній елемент відповідного батьківського вузла.

Процес аналізу

Синтаксичний аналіз здійснюється за допомогою граматики, визначеної у файлі 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

https://crates.io/crates/html_parser_tarasenko

Dependencies

~3.5–4.5MB
~89K SLoC