当前位置: 首页 > 知识库问答 >
问题:

结合使用Rust库reqwest和select

长孙昀
2023-03-14

我试图遵循下面的示例:https://rust-lang-nursery.github.io/rust-cookbook/web/scraping.html,它同时使用Reqwest和Select来获取html响应,然后解析数据。

我使用的是Reqwest Version0.10.4并选择Version0.4.3,这就是它在示例中显示的版本。然而,我得到了一个错误:

error[E0277]: the trait bound `reqwest::Response: std::io::Read` is not satisfied
  --> src/main.rs:19:25
   |
19 |     Document::from_read(res)?
   |                         ^^^ the trait `std::io::Read` is not implemented for `reqwest::Response`
   | 
  ::: /root/.cargo/registry/src/github.com-1ecc6299db9ec823/select-0.4.3/src/document.rs:31:25
   |
31 |     pub fn from_read<R: io::Read>(mut readable: R) -> io::Result<Document> {
   |                         -------- required by this bound in `select::document::Document::from_read`

似乎from_read方法接受Read类型,但reqWest::get方法返回不同的类型。在将响应传递给from_read方法之前,是否必须先进行某种转换?

下面是一个例子:

#[macro_use]
extern crate error_chain;
extern crate reqwest;
extern crate select;

use select::document::Document;
use select::predicate::Name;

error_chain! {
   foreign_links {
       ReqError(reqwest::Error);
       IoError(std::io::Error);
   }
}

fn main() -> Result<()> {
    let res = reqwest::get("https://www.rust-lang.org/en-US/").await?;

    Document::from_read(res)?
        .find(Name("a"))
        .filter_map(|n| n.attr("href"))
        .for_each(|x| println!("{}", x));

    Ok(())
}

共有1个答案

麻学博
2023-03-14

reqWest::get返回结果 ,然后使用展开结果,这意味着您现在有了一个response对象。因为web调用可以成功地发生但仍然失败(请参见HTTP Non200代码),所以您应该检查响应代码,但由于这是为了了解,我们将忽略它。您需要的是一个实现std::io::read特征的结构,阅读该结构会显示string实现该特征。返回reqWest::Response显示,我们可以使用text()方法返回字符串。所以你的代码现在变成了

let res = reqwest::get("https://www.rust-lang.org/en-US/")
              .await?
              .text()
              .await?;

从注释中更新:现在的问题是document::from_read只接受std::Io::read作为参数,std::string::string不实现该特征,而不是使用类似于StringReader的板条箱,我们可以简单地使用document::from作为文档实现from<&'astr>特征。

和几乎所有的事情一样,有多种方法可以解决这个问题。你可以

>

  • 直接使用Document::from(res)从字符串创建文档,或

    将字符串转换为实现Read的字节片,并用document::from_read(res.as_bytes())创建文档

  •  类似资料:
    • 我正在用JNI异步执行测试Rust。我想在Rust中执行请求,并用回调将结果异步返回到Android。我正在测试代码来执行命令行中的请求,它工作得很好。 这就是它在命令行上的工作方式: null null 我正在检查它是如何工作的,但示例似乎已经过时:*https://github.com/mozilla/rust-android-gradle/blob/master/samples/rust/s

    • 我正在和reqwest图书馆乱搞,想用Rust Playground尝试一些例子。我从web上举了一个最简单的例子,但它不编译。 另一方面,当我在本地计算机(Windows10)上尝试相同的代码时,它确实会编译,但它会导致这个错误: 我已经检查了cargo.toml中的依赖关系: 我认为它与Async/Await运行时有关,但我对Rust语言是新手,我在web上找到的关于这个问题的信息对我来说并不

    • 在过去的几天里,我通过使用reqwest板条箱在Rust中构建一个简单的CL下载管理器来处理HTTP的东西,来处理HTTP。我已经对协议的工作原理有了基本的了解--下载文件时要查找什么头,如何验证请求是否有效等等--但是我很难找到HTTP响应主体中实际字节存储在哪里的答案。 例如,使用reqwest发送请求并获得响应需要很少的时间,所以我认为在这个阶段不可能进行下载。实际上需要时间的是从正文中读取

    • reqwest 用于浏览器异步HTTP请求。支持xmlHttpRequest, JSONP, CORS, 和 CommonJS约束。 API reqwest('path/to/html', function (resp) {  qwery('#content').html(resp)})reqwest({    url: 'path/to/html'  , method: 'post'  , da

    • 问题内容: 大约几个小时前,我在Stack Overflow上询问了有关如何将char []转换为MD5哈希的方法。 Neil Smithline建议我使用BCrypt,但不能将其与char []一起使用。 我使用char []来存储从登录表单中检索到的密码的原因是因为仅支持char []。 当前,我正在尝试使用上面的代码生成哈希,但是由于变量passwordCars的类型为char [],因此不