refactor: implement Extractor
This commit is contained in:
@@ -0,0 +1,29 @@
|
|||||||
|
use scraper::Selector;
|
||||||
|
|
||||||
|
pub(crate) struct Extractor {
|
||||||
|
pub time: Selector,
|
||||||
|
pub departure: Selector,
|
||||||
|
pub delay: Selector,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Extractor {
|
||||||
|
pub(crate) fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
time: Self::get_time_selector(),
|
||||||
|
departure: Self::get_departure_selector(),
|
||||||
|
delay: Self::get_late_selector(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_time_selector() -> Selector {
|
||||||
|
Selector::parse("div.col.c2of12.tour p").unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_departure_selector() -> Selector {
|
||||||
|
Selector::parse("li[data-filter][data-departure-id][data-departure-time]").unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_late_selector() -> Selector {
|
||||||
|
Selector::parse("span.late").unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
-19
@@ -1,7 +1,10 @@
|
|||||||
use anyhow::{anyhow, Result};
|
mod extractor;
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Result};
|
||||||
use scraper::{Html, Selector};
|
use scraper::{Html, Selector};
|
||||||
|
|
||||||
|
use extractor::Extractor;
|
||||||
|
|
||||||
const SIEDLUNG: &str =
|
const SIEDLUNG: &str =
|
||||||
"https://www.vvo-online.de/de/fahrplan/aktuelle-abfahrten-ankuenfte/abfahrten?stopid=33006764";
|
"https://www.vvo-online.de/de/fahrplan/aktuelle-abfahrten-ankuenfte/abfahrten?stopid=33006764";
|
||||||
|
|
||||||
@@ -9,17 +12,15 @@ fn main() -> Result<()> {
|
|||||||
let message = query_server()?;
|
let message = query_server()?;
|
||||||
let html = Html::parse_document(&message);
|
let html = Html::parse_document(&message);
|
||||||
|
|
||||||
let departure_selector = get_departure_selector();
|
let extractor = Extractor::new();
|
||||||
let time_selector = get_time_selector();
|
|
||||||
let late_selector = get_late_selector();
|
|
||||||
|
|
||||||
for departure_block in html.select(&departure_selector) {
|
for departure_block in html.select(&extractor.departure) {
|
||||||
let val = departure_block.value();
|
let val = departure_block.value();
|
||||||
println!("{}", val.attr("data-filter").unwrap().trim());
|
println!("{}", val.attr("data-filter").unwrap().trim());
|
||||||
|
|
||||||
let late = extract_delay(departure_block, &late_selector);
|
let late = extract_delay(departure_block, &extractor.delay);
|
||||||
for time_block in departure_block
|
for time_block in departure_block
|
||||||
.select(&time_selector)
|
.select(&extractor.time)
|
||||||
.next()
|
.next()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.children()
|
.children()
|
||||||
@@ -42,10 +43,6 @@ fn main() -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_late_selector() -> Selector {
|
|
||||||
Selector::parse("span.late").unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn query_server() -> Result<String> {
|
fn query_server() -> Result<String> {
|
||||||
match ureq::get(SIEDLUNG).call() {
|
match ureq::get(SIEDLUNG).call() {
|
||||||
Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?),
|
Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?),
|
||||||
@@ -59,11 +56,3 @@ fn extract_delay(departure_block: scraper::ElementRef, late_selector: &Selector)
|
|||||||
.next()
|
.next()
|
||||||
.map(|content| content.inner_html())
|
.map(|content| content.inner_html())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_time_selector() -> Selector {
|
|
||||||
Selector::parse("div.col.c2of12.tour p").unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_departure_selector() -> Selector {
|
|
||||||
Selector::parse("li[data-filter][data-departure-id][data-departure-time]").unwrap()
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user