使用Kuchiki解析字节时出现“预期的切片,找到u8”错误

时间:2019-07-12 20:43:53

标签: rust kuchiki

尝试执行以下操作时遇到类型错误:

use kuchiki::parse_html;
use kuchiki::traits::*;

fn main() {
    let data = r#"<!DOCTYPE html>
                  <html>
                      <body>
                          test
                      </body>
                  </html>"#;
    let dom = parse_html()
        .from_utf8()
        .from_iter(data.as_bytes());
}

错误是:

error[E0271]: type mismatch resolving `<tendril::fmt::Bytes as tendril::fmt::SliceFormat>::Slice == u8`
  --> src/main.rs:13:10
   |
13 |         .from_iter(data.as_bytes());
   |          ^^^^^^^^^ expected slice, found u8
   |
   = note: expected type `[u8]`
              found type `u8`
   = note: required because of the requirements on the impl of `std::convert::Into<tendril::tendril::Tendril<tendril::fmt::Bytes>>` for `&u8`

data.as_bytes()返回对字节切片(&[u8])的引用,所以我对found u8的来源感到困惑。如何纠正该错误?

以下是该方法的文档:https://docs.rs/kuchiki/0.7.3/kuchiki/traits/trait.TendrilSink.html#method.from_iter

1 个答案:

答案 0 :(得分:2)

使用read_from()代替from_iter(),如下所示:

use kuchiki::parse_html;
use kuchiki::traits::*;

fn main() {
    let data = r#"<!DOCTYPE html>
                  <html>
                      <body>
                          test
                      </body>
                  </html>"#;
    let dom = parse_html()
        .from_utf8()
        .read_from(&mut data.as_bytes());
}

您收到编译错误,因为from_iter()需要项目类型为Tendril的迭代器。 Tendril是一种字符串,因此data的类型必须类似于Vec<&[u8]>,但是您有&[u8]

您也可以使用from_iter()使它工作,但是它的清晰度/效率要差一些:

use kuchiki::parse_html;
use kuchiki::traits::*;

fn main() {
    let data = r#"<!DOCTYPE html>
                  <html>
                      <body>
                          test
                      </body>
                  </html>"#;
    let dom = parse_html()
        .from_utf8()
        .from_iter(vec![data.as_bytes()]);
}