1
0
Fork 0

Further cleanup of the output

This commit is contained in:
Luca Beltrame 2020-01-19 17:37:54 +01:00
parent 090a2de314
commit 5f01bf54a2
Signed by: einar
GPG key ID: 8DF631FD021DB0C5

View file

@ -5,7 +5,7 @@ from dataclasses import dataclass
from datetime import datetime
from itertools import zip_longest
import re
from typing import NamedTuple, Optional, List, Union
from typing import Optional, List
from urllib.parse import urlparse, urlencode, urlunparse
from bs4 import BeautifulSoup
@ -57,7 +57,8 @@ def required_length(nmin, nmax):
class RequiredLength(argparse.Action):
def __call__(self, parser, args, values, option_string=None):
if not nmin <= len(values) <= nmax:
msg = f'argument "{self.dest}" requires between {nmin} and {nmax} arguments'
msg = (f'argument "{self.dest}" requires '
f'between {nmin} and {nmax} arguments')
raise argparse.ArgumentTypeError(msg)
setattr(args, self.dest, values)
return RequiredLength
@ -88,7 +89,8 @@ class HyperdiaTrip:
def get_hyperdia_data(start_station, end_station, hour, minute, day="15",
month="08", year="2020", max_route=5, via=None):
month="08", year="2020", max_route=5, via=None,
use_shinkansen=True):
session = requests.Session()
post_params = HYPERDIA_PARAMS.copy()
@ -103,6 +105,10 @@ def get_hyperdia_data(start_station, end_station, hour, minute, day="15",
post_params["minute"] = minute
post_params["max_route"] = max_route
if not use_shinkansen:
post_params["sprexprs"] = "off"
post_params["sprnozomi"] = "off"
if via is None:
for element in ("via_node01", "via_node02", "via_node03"):
post_params[element] = ""
@ -111,10 +117,10 @@ def get_hyperdia_data(start_station, end_station, hour, minute, day="15",
if len(via) > 3:
raise ValueError("Only up to three through stations are allowed")
for node, station in zip_longest(
for station, node in zip_longest(
via,
("via_node01", "via_node02", "via_node03"),
fill_value=""):
fillvalue=""):
post_params[node] = station
@ -172,7 +178,12 @@ def parse_train_name(element):
# Trains are in a list with only one element, inside a span
selected_item = element.select("td > ul > li > span")[0]
return list(selected_item.stripped_strings)[0]
# Long train lines (for XXX) have newlines in it, remove, along with tabs
result = list(selected_item.stripped_strings)[0]
result = result.replace("\n", "").replace("\t", "")
return result
def parse_track_number(element):
@ -306,12 +317,13 @@ def trip_summary(trip: HyperdiaTrip) -> str:
def hyperdia_search(start_station: str, end_station: str, hour: int,
minute: int, day: int = "15", month: str = "08",
year: int = 2020, max_route: int = 5,
via: List[str] = None, output_type: str = "md"):
via: List[str] = None, output_type: str = "md",
use_shinkansen: bool = True):
# TODO: Error checking
raw_result = get_hyperdia_data(start_station, end_station,
hour, minute, day, month, year, max_route,
via)
via, use_shinkansen)
soup = BeautifulSoup(raw_result.text, "html.parser")
results = parse_hyperdia_html(soup, year=year, month=month, day=day)
@ -334,6 +346,8 @@ def main():
type=lambda d: datetime.strptime(d, "%Y-%m-%d").date())
parser.add_argument("--max-routes", help="Maximum number of routes",
type=int)
parser.add_argument("--no-shinkansen", action="store_false",
help="Do not use shinkansen routes")
parser.add_argument("--via", nargs='+', action=required_length(1, 3),
help="Stations to force route through (min 1, max 3)")
parser.add_argument("--output-type", choices=("md", "json"), default="md",
@ -354,7 +368,8 @@ def main():
hyperdia_search(options.start_station, options.end_station, hour, minute,
day, month, year, options.max_routes, via=options.via,
output_type=options.output_type)
output_type=options.output_type,
use_shinkansen=options.no_shinkansen)
if __name__ == "__main__":