rust - 如何使用 html5ever 解析页面、修改 DOM 并序列化它?

标签 rust servo html5ever

我想解析一个网页,在特定位置插入 anchor 并再次渲染修改后的 DOM,以便为 Dash 生成文档集。 .这可能吗?

从 html5ever 中包含的示例中,我可以看到如何读取 HTML 文件并进行可怜的 HTML 输出,但我不明白如何修改 RcDom我检索到的对象。

我希望看到将 anchor 元素 ( <a name="foo"></a> ) 插入到 RcDom 的片段.

注意:这是一个关于 Rust 和 html5ever 的问题……我知道如何用其他语言或更简单的 HTML 解析器来做。

最佳答案

下面是一些解析文档、向链接添加 anchor 并打印新文档的代码:

extern crate html5ever;

use html5ever::{ParseOpts, parse_document};
use html5ever::tree_builder::TreeBuilderOpts;
use html5ever::rcdom::RcDom;
use html5ever::rcdom::NodeEnum::Element;
use html5ever::serialize::{SerializeOpts, serialize};
use html5ever::tendril::TendrilSink;

fn main() {
    let opts = ParseOpts {
        tree_builder: TreeBuilderOpts {
            drop_doctype: true,
            ..Default::default()
        },
        ..Default::default()
    };
    let data = "<!DOCTYPE html><html><body><a href=\"foo\"></a></body></html>".to_string();
    let dom = parse_document(RcDom::default(), opts)
        .from_utf8()
        .read_from(&mut data.as_bytes())
        .unwrap();

    let document = dom.document.borrow();
    let html = document.children[0].borrow();
    let body = html.children[1].borrow(); // Implicit head element at children[0].

    {
        let mut a = body.children[0].borrow_mut();
        if let Element(_, _, ref mut attributes) = a.node {
            attributes[0].value.push_tendril(&From::from("#anchor"));
        }
    }

    let mut bytes = vec![];
    serialize(&mut bytes, &dom.document, SerializeOpts::default()).unwrap();
    let result = String::from_utf8(bytes).unwrap();
    println!("{}", result);
}

这将打印以下内容:

<html><head></head><body><a href="foo#anchor"></a></body></html>

如您所见,我们可以通过 children 属性在子节点中导航。

我们可以更改元素的属性向量中的属性。

关于rust - 如何使用 html5ever 解析页面、修改 DOM 并序列化它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38859811/

相关文章:

rust - 将向量解析为正确的类型

c - Proteus 中伺服电机无法正常转动

python - 使用 Raspberry Pi 和 Python 控制连续伺服电机

c - 我在 Arduino 代码中看不到错误。

html - 如何使用 Kuchiki 获取 HTML 文档的所有文本(除了 script/style/noscript 标签)?

string - [T] 与 [T] 之间的差异

rust - 如何通过 FFI 公开编译时生成的静态 C 字符串?

web-scraping - 如何使用html5ever解析页面并找到所有链接?

rust - 是否有一种习惯用法可以将 var 分配给不安全调用的结果并稍后使用该 var 而无需将其他所有内容嵌套在 unsafe{} 内?