我正在尝试解析 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 文档阅读器......如果这甚至可能的话。
文档parse_document
说要使用from_utf8
或者from_bytes
输入是否以字节为单位(它是)。
似乎我需要从响应中创建一个接收器,但这就是我卡住的地方。我也不清楚如何创建事件来监听我感兴趣的标签开始。
我已经查看了 html5ever 的这个示例,它似乎可以执行我想要的操作并遍历 DOM,但是我无法让这个示例本身运行——要么它已经过时,要么卷须/html5ever 太新。这似乎也将 HTML 解析为一个整体而不是一个流,但我不确定。
是否可以对这些库的当前实现做我想做的事情?