克隆soup仓库示例运行正常,新建项目复用代码遇编译错误
解决soup和reqwest复用代码时的编译错误
我来帮你逐个拆解并修复这三个编译错误:
1. 修复?无法应用于Future的问题
你虽然给reqwest加了blocking特性,但直接调用reqwest::get其实是异步版本的方法,它返回的是Future而非直接的响应结果。要使用阻塞式请求,得调用专属的阻塞模块方法:
// 把原来的reqwest::get改成下面这个 let resp = reqwest::blocking::get("https://docs.rs/soup/0.1.0/soup/")?;
2. 解决错误类型不兼容的问题
你的main函数返回Result<(), Box<Error>>,这里的Error是std::fmt::Error,但reqwest和soup抛出的是IO错误、请求错误这类完全不同的类型,它们没法转换成格式化错误。你需要把返回类型改成支持所有标准错误的泛型错误类型,同时导入对应的trait:
// 删掉原来的use std::fmt::Error,换成这个 use std::error::Error; // 修正main的返回类型 fn main() -> Result<(), Box<dyn Error>> { // ... 其余代码不变 }
3. 修复找不到tag方法的问题
从soup.find()拿到的section节点是Rc<Node>类型,要调用它的tag方法,必须导入soup提供的HandleExt扩展trait——这个trait专门给节点添加了查询相关的方法。在代码开头加上:
use soup::handle_ext::HandleExt;
修复后的完整代码
use std::collections::HashSet; use std::error::Error; use soup::Soup; use soup::handle_ext::HandleExt; use reqwest; fn main() -> Result<(), Box<dyn Error>> { let resp = reqwest::blocking::get("https://docs.rs/soup/0.1.0/soup/")?; let soup = Soup::from_reader(resp)?; let result = soup .tag("section") .attr("id", "main") .find() .and_then(|section| { section .tag("span") .attr("class", "in-band") .find() .map(|span| span.text()) }); assert_eq!(result, Some("Crate soup".to_string())); Ok(()) }
额外小建议
你的reqwest版本是0.10.0-alpha.2,属于比较老的测试版,如果你想更稳定,可以把Cargo.toml里的reqwest依赖改成稳定版:
reqwest = { version = "0.11", features = ["blocking"] }
内容的提问来源于stack exchange,提问作者王奕然
相关产品推荐
相关产品推荐

