gpt4 book ai didi

rust - 使用 hyper 和 html5ever 解析流中的 HTML 页面内容

转载 作者:行者123 更新时间:2023-11-29 07:43:24 41 4
gpt4 key购买 nike

我正在尝试解析 HTTP 请求的 HTML 响应。我正在使用 hyper对于请求和html5ever用于解析。 HTML 将非常大,我不需要完全解析它——我只需要从标签中识别一些数据,所以我更愿意流式传输它。从概念上讲,我想做类似的事情:

# bash
curl url | read_dom

/* javascript */
http.get(url).pipe(parser);
parser.on("tag", /* check tag name, attributes, and act */)

到目前为止我想出的是:

extern crate hyper;
extern crate html5ever;

use std::default::Default
use hyper::Client;
use html5ever::parse_document;
use html5ever::rcdom::{RcDom};

fn main() {
let client = Client::new();

let res = client.post(WEBPAGE)
.header(ContentType::form_url_encoded())
.body(BODY)
.send()
.unwrap();

res.read_to_end(parse_document(RcDom::default(),
Default::default().from_utf8().unwrap()));
}

好像read_to_end是我想在响应中调用以读取字节的方法,但我不清楚如何将其通过管道传输到 HTML 文档阅读器......如果这可能的话。

The documentation for parse_document如果输入以字节为单位(它是字节),则表示使用 from_utf8from_bytes

看来我需要根据响应创建一个接收器,但这就是我被卡住的地方。我也不清楚如何创建事件来监听我感兴趣的标签开始。

我看过this example of html5ever这似乎做我想做的事并遍历 DOM,但我无法让这个例子本身运行——要么它已经过时,要么 tendril/html5ever 太新了。这似乎也将 HTML 解析为一个整体而不是一个流,但我不确定。

是否可以使用这些库的当前实现来做我想做的事情?

最佳答案

很抱歉缺少 html5ever 和 tendril 的类似教程的文档......

除非您 100% 确定您的内容是 UTF-8 格式,否则请使用 from_bytes而不是 from_utf8 .他们返回实现 TendrilSink 的东西这允许您递增地(或不递增地)提供输入。

std::io::Read::read_to_end方法需要一个 &mut Vec<u8> , 所以它不适用于 TendrilSink .

在最低级别,您可以调用 TendrilSink::process每一次方法 &[u8] block ,然后调用 TendrilSink::finish .

为了避免手动执行此操作,还有 TendrilSink::read_from采用 &mut R where R: std::io::Read 的方法.自 hyper::client::Response工具 Read ,你可以使用:

parse_document(RcDom::default(), Default::default()).from_bytes().read_from(&mut res)

为了超越您的问题,RcDom非常小,主要用于测试 html5ever。我建议使用 Kuchiki反而。它具有更多功能(用于树遍历、CSS 选择器匹配等),包括可选的 Hyper 支持。

在你的Cargo.toml :

[dependencies]
kuchiki = {version = "0.3.1", features = ["hyper"]}

在您的代码中:

let document = kuchiki::parse_html().from_http(res).unwrap();

关于rust - 使用 hyper 和 html5ever 解析流中的 HTML 页面内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35654525/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com