15

HTTP リクエストの HTML レスポンスを解析しようとしています。リクエストにはハイパーを使用し、解析には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_utf8from_bytes、入力がバイト単位の場合 (これはそうです) と書かれています。

応答からシンクを作成する必要があるようですが、ここで立ち往生しています。また、私が興味を持っているタグの開始をリッスンするイベントを作成する方法も不明です。

私はこのhtml5everの例を見てきましたが、これは私が望むことをしているようで、DOMを歩き回っていますが、この例自体を実行することはできません.時代遅れであるか、tendril/html5everが新しすぎます. これも、HTML をストリームとしてではなく全体として解析するようですが、よくわかりません。

これらのライブラリの現在の実装でやりたいことを行うことは可能ですか?

4

3 に答える 3

-3

これを追加してみてください:

let mut result: Vec<u8> = Vec::new();

res.read_to_end(&mut result);

let parse_result = parse_document(RcDom::default(), Default::default())
    . //read parameters
    .unwrap();

クレートのドキュメントに一致するパラメーター...

于 2016-02-26T20:03:41.330 に答える