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.

关于双重许可的特殊条款请参见COPYING.md


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)

![Rust Logo](rust-logo.png)

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文档,建议分块处理以提高内存效率。

注意事项

  1. 不是所有HTML标签都能完美转换为Markdown
  2. 复杂的CSS样式和JavaScript生成的内容不会被保留
  3. 转换结果可能需要手动调整以获得最佳效果

完整示例代码

// 导入所需库
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(())
}

这个完整示例展示了:

  1. 使用reqwest获取网页HTML内容
  2. 使用html2md将HTML转换为Markdown
  3. 将结果保存到文件
  4. 添加了进度提示信息

要运行此示例,需要在Cargo.toml中添加以下依赖:

[dependencies]
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1.0", features = ["full"] }
html2md = "0.2"
回到顶部