Ржавое приключение: анализ HTML стал проще с примерами кода

Привет, коллеги-разработчики! Сегодня мы отправляемся в приключение Расти в мир парсинга HTML. Независимо от того, создаете ли вы веб-скребок, инструмент для извлечения данных или просто хотите программно манипулировать HTML-документами, наличие надежного анализатора HTML имеет важное значение. В этом посте мы рассмотрим несколько методов и примеры кода для анализа HTML с помощью Rust.

  1. html5ever: Начнем с html5ever, надежной библиотеки синтаксического анализа HTML для Rust. Он соответствует спецификации HTML5 и предоставляет удобный API для анализа HTML-документов. Вот простой пример для начала:
use html5ever::parse_document;
use html5ever::tendril::TendrilSink;
fn parse_html(html: &str) {
    let handler = parse_document(MyHtmlParser, Default::default());
    let _ = handler.from_utf8().read_from(&mut html.as_bytes());
    // Process the parsed HTML here
}
  1. kuchiki: Еще одна популярная библиотека Rust для анализа HTML — kuchiki. Он предлагает простой и интуитивно понятный API, вдохновленный jQuery, что позволяет легко просматривать и манипулировать HTML-документами. Вот пример использования кучики для поиска всех ссылок в HTML-документе:
use kuchiki::traits::*;
use kuchiki::NodeRef;
fn find_links(html: &str) {
    let document = kuchiki::parse_html().one(html);
    let links = document.select("a").unwrap();

    for link in links {
        println!("{}", link.text_contents());
        println!("{}", link.attributes.borrow().get("href").unwrap());
    }
}
  1. скребок. Если вы предпочитаете более легкое решение, парсер — отличный выбор. Он использует селекторы CSS для извлечения данных из HTML, подобно библиотекам, таким как BeautifulSoup в Python. Вот пример, демонстрирующий, как извлечь текст из всех элементов <h2>в HTML-документе:
use scraper::{Html, Selector};
fn extract_headings(html: &str) {
    let document = Html::parse_document(html);
    let selector = Selector::parse("h2").unwrap();

    for heading in document.select(&selector) {
        println!("{}", heading.text().collect::<String>());
    }
}
  1. регулярное выражение: хотя использование регулярных выражений для анализа HTML обычно не рекомендуется из-за сложности синтаксиса HTML, оно может быть полезно для быстрых и простых задач. Библиотека регулярных выражений Rust предоставляет мощные возможности регулярных выражений. Вот пример извлечения всех гиперссылок из HTML-документа с помощью регулярного выражения:
use regex::Regex;
fn extract_links(html: &str) {
    let re = Regex::new(r#"<a\s+(?:[^>]*?\s+)?href=["']([^"']*)["']"#).unwrap();

    for capture in re.captures_iter(html) {
        println!("{}", capture.get(1).unwrap().as_str());
    }
}

Это всего лишь несколько методов анализа HTML в Rust. Каждая библиотека имеет свои сильные стороны и особенности, поэтому выберите ту, которая лучше всего соответствует вашим потребностям. Приятного разбора!