You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

克隆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,提问作者王奕然

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:52:41