我正在尝试解析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
。
似乎我需要从响应中创建一个sink,但是这就是我卡住的地方。我也不清楚如何创建事件来监听我感兴趣的标签开始。
我看了一下html5ever的这个示例,它似乎做了我想要的并遍历了DOM,但我无法运行这个示例本身--要么它已经过时了,要么tendril/html5ever太新了。这似乎也将整个HTML解析为一个流,而不是作为一个流,但我不确定。
“在当前这些库的实现下,我想做的事情是否可能实现?”
.descendants()
和.inclusive_descendants()
等方法,返回节点的迭代器。我不确定你所说的“开放标签”是什么意思。 Kuchiki不是基于事件的,一旦解析完成,就会得到树形数据结构。 - Simon Sapinonstarttag
等事件。 - Explosion Pills