Rust:
Разбор HTML

Как это сделать:

Чтобы разобрать HTML в Rust, вам, скорее всего, захочется использовать такую библиотеку, как scraper или select. Вот быстрый пример с использованием scraper:

use scraper::{Html, Selector};

fn main() {
    // Ввод HTML в виде строки
    let html = r#"
        <html>
            <body>
                <p>Привет, мир!</p>
            </body>
        </html>
    "#;

    // Разбор строки HTML
    let document = Html::parse_document(html);
    
    // Создание селектора для поиска всех тегов <p>
    let selector = Selector::parse("p").unwrap();

    // Итерация по элементам, соответствующим селектору
    for element in document.select(&selector) {
        // Вывод текста внутри каждого тега <p>
        println!("{}", element.text().collect::<Vec<_>>().concat());
    }
}

Вывод:

Привет, мир!

Глубокое погружение

В прошлом парсинг HTML был запутанным делом. Библиотеки различались, стандарты менялись, а языки программирования отличались подходами. Сегодня экосистема Rust предлагает надежные библиотеки для парсинга, такие как scraper, которые опираются на библиотеки html5ever и selectors. html5ever особенно интересен; он основан на алгоритме разбора HTML, указанном WHATWG, что ставит его вровень с тем, как современные браузеры разбирают HTML.

Альтернативы scraper включают в себя select, который предлагает похожую функциональность, но другую эргономику. Низкоуровневый парсинг возможен непосредственно с помощью html5ever, если вам необходим больший контроль.

Часто парсинг HTML является частью веб-скрапинга, где вы извлекаете данные с веб-сайтов. Важно (и этично) уважать robots.txt сайта и условия обслуживания при скрапинге.

С точки зрения реализации, всегда помните, что парсинг — это только начало. Санитизация и валидация ключевы для избежания проблем с безопасностью, таких как атаки XSS (межсайтовый скриптинг), особенно если вы планируете отображать или сохранять разобранные данные.

Смотрите также