Rust HTML转Markdown库html2md的使用,高效实现网页内容与轻量级标记语言的转换
Rust HTML转Markdown库html2md的使用,高效实现网页内容与轻量级标记语言的转换
HTML2MD
这是一个将简单HTML文档转换为Markdown格式的库。实现了Markdown标准规范。
特性
当前支持的功能:
- 列表(包括嵌套列表)
- 标题
- 引用(包括嵌套引用)
- 段落
- 水平分割线
- 图片和链接
- 表格
- 格式化(粗体、斜体、删除线、下划线)
- 代码块
限制
- 不支持Markdown的变体风格(如-/+无序列表样式,##/==标题等)
- 还不能自动检测代码风格
使用的库
html5ever - Servo引擎的HTML解析库,用于将HTML输入转换为DOM
regex - Rust的PCRE支持,用于修正空白字符
安装
安装为命令行工具
cargo install html2md
安装为库
在项目目录中运行以下Cargo命令:
cargo add html2md
或者在Cargo.toml中添加:
html2md = "0.2.15"
完整使用示例
use html2md::parse_html;
fn main() {
let html = r#"
<h1>这是标题</h1>
<p>这是一个段落,包含<strong>粗体</strong>和<em>斜体</em>文本。</p>
<ul>
<li>列表项1</li>
<li>列表项2</li>
</ul>
<blockquote>这是一个引用</blockquote>
"#;
let markdown = parse_html(html);
println!("{}", markdown);
}
输出结果:
这是标题
这是一个段落,包含粗体和斜体文本。
- 列表项1
- 列表项2
这是一个引用
## 更完整的示例代码
```rust
use html2md::parse_html;
use std::fs;
fn main() {
// 示例1: 基本HTML转换
let basic_html = r#"
<div>
<h2>HTML转Markdown示例</h2>
<p>这是一个<u>完整</u>的示例,展示<del>各种</del> <strong>HTML</strong> <em>元素</em>的转换</p>
<hr>
<pre><code>fn main() {
println!("Hello World");
}</code></pre>
</div>
"#;
let basic_md = parse_html(basic_html);
println!("基本示例输出:\n{}", basic_md);
// 示例2: 从文件读取HTML并转换
if let Ok(html_content) = fs::read_to_string("example.html") {
let file_md = parse_html(&html_content);
println!("\n文件示例输出:\n{}", file_md);
} else {
eprintln!("无法读取example.html文件");
}
// 示例3: 复杂HTML结构
let complex_html = r#"
<article>
<h3>复杂结构示例</h3>
<table>
<thead>
<tr><th>Name</th><th>Age</th></tr>
</thead>
<tbody>
<tr><td>Alice</td><td>25</td></tr>
<tr><td>Bob</td><td>30</td></tr>
</tbody>
</table>
<ol>
<li>第一项</li>
<li>第二项
<ul>
<li>嵌套项A</li>
<li>嵌套项B</li>
</ul>
</li>
</ol>
<blockquote>
<p>嵌套引用</p>
<blockquote>更深层的引用</blockquote>
</blockquote>
</article>
"#;
let complex_md = parse_html(complex_html);
println!("\n复杂示例输出:\n{}", complex_md);
}
贡献
您可以创建合并请求或在这里提交bug/改进问题,或者通过电子邮件发送格式化的补丁。详情请参见仓库中的CONTRIBUTING.md文件。
许可证
Copyright (C) 2018-2019 Oleg `Kanedias` Chernovskiy
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
1 回复
Rust HTML转Markdown库html2md使用指南
介绍
html2md
是一个轻量级的Rust库,用于将HTML内容转换为Markdown格式。它特别适合需要将网页内容转换为更简洁的Markdown格式的场景,如内容爬取、文档转换等。
安装
在Cargo.toml中添加依赖:
[dependencies]
html2md = "0.2"
基本使用方法
// 导入html2md库
use html2md::parse_html;
fn main() {
// 定义HTML字符串
let html = r#"<h1>标题</h1><p>这是一个<strong>段落</strong></p>"#;
// 转换为Markdown
let markdown = parse_html(html);
// 输出结果
println!("{}", markdown);
}
输出:
# 标题
这是一个**段落**
高级功能
1. 处理复杂HTML结构
// 定义包含多种HTML元素的复杂结构
let html = r#"
<div class="article">
<h1>Rust编程语言</h1>
<p>Rust是一种<em>系统编程语言</em>,注重<strong>安全</strong>和<strong>性能</strong>。</p>
<ul>
<li>内存安全</li>
<li>零成本抽象</li>
<li>线程安全</li>
</ul>
</div>
"#;
// 转换并输出
let markdown = parse_html(html);
println!("{}", markdown);
输出:
# Rust编程语言
Rust是一种*系统编程语言*,注重**安全**和**性能**。
* 内存安全
* 零成本抽象
* 线程安全
2. 处理链接和图片
// 包含链接和图片的HTML
let html = r#"
<p>访问<a href="https://www.rust-lang.org">Rust官网</a></p>
<img src="rust-logo.png" alt="Rust Logo" />
"#;
// 转换并输出
let markdown = parse_html(html);
println!("{}", markdown);
输出:
访问[Rust官网](https://www.rust-lang.org)

3. 处理表格
// 定义HTML表格
let html = r#"
<table>
<tr><th>特性</th><th>描述</th></tr>
<tr><td>所有权</td><td>内存管理模型</td></tr>
<tr><td>借用检查</td><td>编译时检查数据竞争</td></tr>
</table>
"#;
// 转换并输出
let markdown = parse_html(html);
println!("{}", markdown);
输出:
| 特性 | 描述 |
| --- | --- |
| 所有权 | 内存管理模型 |
| 借用检查 | 编译时检查数据竞争 |
自定义选项
// 导入结构化打印器
use html2md::StructuredPrinter;
// 定义HTML内容
let html = r#"<h1>自定义标题</h1><p>自定义内容</p>"#;
// 创建打印机实例并设置选项
let mut printer = StructuredPrinter::default();
printer.short = true; // 使用更简洁的Markdown格式
// 转换并输出
let markdown = printer.print(html);
println!("{}", markdown);
性能考虑
html2md
设计为高效转换:
- 使用Rust的零成本抽象
- 避免不必要的内存分配
- 单次遍历HTML结构
对于大型HTML文档,建议分块处理以提高内存效率。
注意事项
- 不是所有HTML标签都能完美转换为Markdown
- 复杂的CSS样式和JavaScript生成的内容不会被保留
- 转换结果可能需要手动调整以获得最佳效果
完整示例代码
// 导入所需库
use reqwest;
use html2md::parse_html;
use std::fs;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 获取网页内容
println!("正在获取网页内容...");
let response = reqwest::get("https://example.com").await?;
let html = response.text().await?;
// 2. 转换为Markdown
println!("正在转换为Markdown...");
let markdown = parse_html(&html);
// 3. 保存到文件
println!("正在保存到文件...");
fs::write("output.md", markdown)?;
println!("转换完成!已保存到output.md");
Ok(())
}
这个完整示例展示了:
- 使用reqwest获取网页HTML内容
- 使用html2md将HTML转换为Markdown
- 将结果保存到文件
- 添加了进度提示信息
要运行此示例,需要在Cargo.toml中添加以下依赖:
[dependencies]
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1.0", features = ["full"] }
html2md = "0.2"