Привет, коллеги-разработчики! Сегодня мы отправляемся в приключение Расти в мир парсинга HTML. Независимо от того, создаете ли вы веб-скребок, инструмент для извлечения данных или просто хотите программно манипулировать HTML-документами, наличие надежного анализатора HTML имеет важное значение. В этом посте мы рассмотрим несколько методов и примеры кода для анализа HTML с помощью Rust.
- 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
}
- 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());
}
}
- скребок. Если вы предпочитаете более легкое решение, парсер — отличный выбор. Он использует селекторы 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>());
}
}
- регулярное выражение: хотя использование регулярных выражений для анализа 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. Каждая библиотека имеет свои сильные стороны и особенности, поэтому выберите ту, которая лучше всего соответствует вашим потребностям. Приятного разбора!