manaba_sdk/scrape/
course.rs1use crate::Client;
2use crate::error::Result;
3use scraper::Selector;
4use std::collections::HashMap;
5
6pub struct Course {
7 pub title: String,
8 pub id: String,
9}
10
11impl Client {
12 pub async fn get_courses(&self) -> Result<Vec<Course>> {
13 let html = self.get_html(reqwest::Method::GET, "home_course").await?;
14
15 let selector = Selector::parse("a[href^='course_']").unwrap();
16 let course_elements = html.select(&selector);
17
18 let mut all_courses = HashMap::new();
19 for course_element in course_elements {
20 if let Some(href) = course_element.attr("href") {
21 all_courses
22 .entry(href.to_string())
23 .or_insert(course_element.inner_html());
24 }
25 }
26
27 let courses = all_courses
28 .into_iter()
29 .filter(|(_, v)| v.chars().take(5).all(|c| c.is_numeric()))
30 .map(|(id, title)| Course { title, id })
31 .collect::<Vec<Course>>();
32
33 Ok(courses)
34 }
35}