优秀的编程知识分享平台

网站首页 > 技术文章 正文

在 Rust 中轻松转换 HTML 到 Markdown

nanyue 2024-10-21 06:20:09 技术文章 10 ℃

在当今互联网时代,HTML 和 Markdown 都是非常流行的标记语言。HTML 用于构建网页结构和内容,而 Markdown 则以其简洁易读的语法被广泛用于编写文档、博客文章等。在很多场景下,我们需要将 HTML 内容转换为 Markdown 格式,例如网页内容抓取、文档格式转换等。

Rust 作为一门以安全、性能和可靠性著称的系统级编程语言,也提供了相应的库来处理 HTML 到 Markdown 的转换。本文将介绍一个名为 htmd 的 Rust 库,它提供了一种高效且易于使用的方式来完成这项任务。

htmd 简介

htmd 是一个受 JavaScript 库 turndown.js 启发而开发的 Rust 库,用于将 HTML 文档转换为 Markdown 格式。它具有以下特点:

  • 功能丰富: 提供了与 turndown.js 相媲美的丰富选项,可以灵活地控制转换过程。
  • 可靠性高: 通过了 turndown.js 的所有测试用例,确保转换结果的准确性。
  • 依赖项少: 仅依赖于 html5ever 库,轻量级且易于集成。
  • 性能优异: 转换速度快,能够高效处理大型 HTML 文档。

htmd 的安装

在使用 htmd 之前,我们需要先安装它。将以下依赖项添加到你的 Cargo.toml 文件中:

[dependencies]
htmd = "0.1"

htmd 的使用

基本转换

使用 htmd 进行 HTML 到 Markdown 的基本转换非常简单。以下代码展示了如何将一个 <h1> 标签转换为 Markdown 中的 # 标题:

use htmd::HtmlToMarkdown;

fn main() {
    let markdown = HtmlToMarkdown::new();
    let html = "<h1>这是一个标题</h1>";
    let result = markdown.convert(html).unwrap();
    assert_eq!(result, "# 这是一个标题\n");
}

跳过标签

在某些情况下,我们可能希望跳过 HTML 文档中的某些标签,例如 <script><style> 标签。htmd 提供了 skip_tags 方法来实现这一点:

use htmd::HtmlToMarkdown;

fn main() {
    let markdown = HtmlToMarkdown::builder()
        .skip_tags(vec!["script", "style"])
        .build();

    let html = r#"
        <script>
            // 一些 JavaScript 代码
        </script>
        <h1>这是一个标题</h1>
    "#;

    let result = markdown.convert(html).unwrap();
    assert_eq!(result, "# 这是一个标题\n");
}

自定义标签处理器

htmd 允许我们自定义标签处理器来处理特定的 HTML 标签。例如,我们可以定义一个处理器将 <img> 标签转换为 Markdown 中的图片语法:

use htmd::{HtmlToMarkdown, HandleResult};
use html5ever::tendril::StrTendril;
use html5ever::QualName;

fn main() {
    let markdown = HtmlToMarkdown::builder()
        .add_handler(
            vec!["img"],
            |el| {
                let src = el
                    .attrs
                    .iter()
                    .find(|(name, _)| name.local.as_ref() == "src")
                    .map(|(_, value)| value.as_ref());

                let alt = el
                    .attrs
                    .iter()
                    .find(|(name, _)| name.local.as_ref() == "alt")
                    .map(|(_, value)| value.as_ref());

                match (src, alt) {
                    (Some(src), Some(alt)) => Some(format!("![{}]({})", alt, src)),
                    _ => None,
                }
            },
        )
        .build();

    let html = r#"<img src="https://example.com/image.jpg" alt="图片描述">"#;
    let result = markdown.convert(html).unwrap();
    assert_eq!(result, "![图片描述](https://example.com/image.jpg)\n");
}

多线程处理

htmd 支持多线程处理,可以充分利用多核 CPU 的性能来加速转换过程。以下代码展示了如何使用多线程将多个 HTML 文档转换为 Markdown:

use htmd::HtmlToMarkdown;
use std::sync::Arc;
use std::thread;

fn main() {
    let markdown = Arc::new(HtmlToMarkdown::new());
    let html_docs = vec![
        "<h1>文档 1</h1>",
        "<h2>文档 2</h2>",
        "<h3>文档 3</h3>",
    ];

    let threads: Vec<_> = html_docs
        .into_iter()
        .map(|html| {
            let markdown = markdown.clone();
            thread::spawn(move || {
                let result = markdown.convert(html).unwrap();
                println!("{}", result);
            })
        })
        .collect();

    for thread in threads {
        thread.join().unwrap();
    }
}

结论

htmd 是一个功能强大且易于使用的 Rust 库,用于将 HTML 文档转换为 Markdown 格式。它提供了丰富的选项、自定义标签处理器和多线程支持,可以满足各种转换需求。如果你正在寻找一种高效可靠的 HTML 到 Markdown 转换解决方案,htmd 绝对值得一试。

Tags:

最近发表
标签列表