如何使用Rust从内存中加载html到无头Chrome?

xjreopfe  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(208)

我有一个html文本,我得到后,解析它与Handlebars

let mut handlebars = Handlebars::new();
let source = fs::read_to_string("receipt-template.html").unwrap();
handlebars.register_template_string("t1", source).unwrap();
let mut data = BTreeMap::new();
data.insert("name".to_string(), "世界!".to_string());

// this variable contains <html>....</html> that I want to load into headless chrome
let html = handlebars.render("t1", &data).unwrap();

据我从headless chrome documentation here了解,它只能加载一个网站网址,如“https://www.wikipedia.org”。

let browser = Browser::default()?;
let tab = browser.new_tab()?;

/// Navigate to wikipedia
tab.navigate_to("https://www.wikipedia.org")?;

有没有可能使用headless chrome来加载存储在变量/内存中的html字符串?
我知道这在Node.js中是可能的,因为我使用puppeteer.setContent(html)

/// NODE.JS
const launchOptions = { executablePath }
const browser = await puppeteer.launch(launchOptions)
const page = await browser.newPage()
await page.setContent(html) // this sets the browser content into html variable directly without the use of file
wfveoks0

wfveoks01#

是的,可以加载HTML字符串。
在Chrome中,你可以使用data-URI /data协议直接加载HTML,如下所示:data:text/html;charset=utf-8,<Here goes your UTF8 encoded HTML> .
因此,您真正需要的是tab.navigate_to方法。
下面是一个完整的例子:

use headless_chrome::{Browser, protocol::cdp::Page};

fn load_html_string() -> Result<(), Box<dyn std::error::Error>> {
    let browser = Browser::default()?;

    let tab = browser.new_tab()?;

    let html = r##"
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Hello World</title>
    </head>
    <body>
        <h1>Hello World!</h1>
    </body>
    </html>
    "##;

    tab.navigate_to(format!("data:text/html;charset=utf-8,{}", html).as_str())?;

    let jpeg_data = tab.capture_screenshot(
        Page::CaptureScreenshotFormatOption::Jpeg,
        Some(75),
        None,
        true)?;

    std::fs::write("hello_world.jpeg", jpeg_data)?;

    Ok(())
}

fn main() {
    load_html_string().unwrap();
}

它会在你的cargo根目录下生成一个新的JPEG,看起来像这样:

相关问题