Rust中的HTML解析:用于网页抓取的库和示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust中的HTML解析:工具概览与实践示例



Rust是一种现代系统编程语言,越来越多地被用于创建高性能的网页抓取器和解析器。凭借其严格的类型系统、内存安全性和异步能力,Rust非常适合需要快速可靠地从HTML文档中提取数据的任务。在本文中,我们将介绍Rust中用于HTML解析的关键库、它们的特点,并提供可运行的代码示例。



Rust中用于HTML解析的主要库



Rust生态系统提供了几个成熟的HTML处理解决方案。最受欢迎的有:



  • scraper — 一个高级库,支持CSS选择器,构建在select.rs和html5ever之上。
  • select.rs — 一个使用CSS选择器从DOM中提取数据的库。
  • html5ever — 一个符合HTML5标准的低级解析器(在Servo内部使用)。
  • quick-xml — 一个基于流式读取的快速XML/HTML解析器,适用于简单任务。


对于大多数网页抓取任务,推荐使用scraper,因为它提供了方便的API和活跃的社区支持。



安装与配置



将依赖项添加到Cargo.toml文件中:



[dependencies]scraper = "0.20"reqwest = { version = "0.12", features = ["blocking"] }


reqwest库用于HTTP请求。如果您更喜欢异步方法,请将reqwest与tokio一起使用。



示例1:提取页面标题



让我们编写一个简单的解析器,从网页中获取<title>标题和所有<h1>标题:



use scraper::{Html, Selector};

fn main() -> Result<(), Box<dyn std::error::Error>> { let html = r#" <html> <head><title>示例页面</title></head> <body> <h1>第一个标题</h1> <h1>第二个标题</h1> </body> </html> "#;

let document = Html::parse_document(html);

// 提取title let title_selector = Selector::parse("title").unwrap(); if let Some(title_element) = document.select(&title_selector).next() { let title_text = title_element.text().collect::().join(""); println!("页面标题: {}", title_text); }

// 提取所有h1 let h1_selector = Selector::parse("h1").unwrap(); for element in document.select(&h1_selector) { let text = element.text().collect::().join(""); println!("H1: {}", text); }

Ok(())}


在这个示例中,我们解析了静态HTML。对于真实网站,HTML通常通过HTTP请求获取。



示例2:使用HTTP请求解析真实网站



现在,我们使用reqwest来加载页面并提取链接:



use scraper::{Html, Selector};

fn main() -> Result<(), Box<dyn std::error::Error>> { let response = reqwest::blocking::get("https://www.rust-lang.org")?; let html = response.text()?;

let document = Html::parse_document(&html); let link_selector = Selector::parse("a[href]").unwrap();

println!("页面上的链接:"); for link in document.select(&link_selector) { if let Some(href) = link.value().attr("href") { let text = link.text().collect::(); println!(" 文本: '{}' -> URL: {}", text.trim(), href); } }

Ok(())}


请注意attr("href")方法——它允许获取属

推荐