diff --git a/src/infrastructure/repository/parsers/otakudesu_parser.rs b/src/infrastructure/repository/parsers/otakudesu_parser.rs index 7d0d3be..704df8e 100644 --- a/src/infrastructure/repository/parsers/otakudesu_parser.rs +++ b/src/infrastructure/repository/parsers/otakudesu_parser.rs @@ -410,6 +410,16 @@ pub fn parse_latest_anime_document( // SEARCH ANIME PAGE // ============================================================================ +/// Normalise scraped text: collapse newlines/tabs into single spaces and trim. +fn clean_text(text: String) -> String { + text.replace(['\n', '\t'], " ") + .split_whitespace() + .collect::>() + .join(" ") + .trim() + .to_string() +} + pub fn parse_search_anime_document( html: &str, page: &str, @@ -417,53 +427,82 @@ pub fn parse_search_anime_document( let document = parse_html(html); let mut items = Vec::new(); - let venz_sel = selector(".venz ul li") - .ok_or_else(|| ScrapingError::Parse("Failed to parse .venz ul li selector".into()))?; - let title_sel = selector(".thumbz h2.jdlflm") - .ok_or_else(|| ScrapingError::Parse("Failed to parse title selector".into()))?; - let link_sel = selector("a") - .ok_or_else(|| ScrapingError::Parse("Failed to parse link selector".into()))?; - let img_sel = selector("img") - .ok_or_else(|| ScrapingError::Parse("Failed to parse img selector".into()))?; - let ep_sel = selector(".epz") - .ok_or_else(|| ScrapingError::Parse("Failed to parse epz selector".into()))?; - let genre_sel = selector(".genre-tag") - .ok_or_else(|| ScrapingError::Parse("Failed to parse genre-tag selector".into()))?; - let status_sel = selector(".status") - .ok_or_else(|| ScrapingError::Parse("Failed to parse status selector".into()))?; - let rating_sel = selector(".rating") - .ok_or_else(|| ScrapingError::Parse("Failed to parse rating selector".into()))?; + // Otakudesu search results live under `