From 9632170cd15105955c24bfba9a31c1143db10ee3 Mon Sep 17 00:00:00 2001 From: kmein Date: Thu, 17 May 2018 16:20:28 +0200 Subject: [PATCH] Handle exception if rhyme url cannot be found --- rilke.py | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/rilke.py b/rilke.py index d7a87df..cfab8f0 100644 --- a/rilke.py +++ b/rilke.py @@ -1,16 +1,17 @@ from argparse import ArgumentParser -from enum import Enum from bs4 import BeautifulSoup +from enum import Enum +from sys import stderr +from typing import Iterator, NewType import re import requests -from typing import Iterator, NewType +Url = NewType("Url", str) class Language(Enum): EN = "en" DE = "de" DEFAULT_LANG = Language.DE -Url = NewType("Url", str) def cook_soup(url: Url) -> BeautifulSoup: return BeautifulSoup(requests.get(url).text, "lxml") @@ -24,30 +25,30 @@ def entry_url(word: str, lang: Language = DEFAULT_LANG) -> Url: def rhymes_url(entry_url: Url, lang: Language = DEFAULT_LANG) -> Url: soup = cook_soup(entry_url) result_url = base_url(lang) - try: - if lang == Language.DE: - result_url += soup.find("a", href=re.compile(r"/wiki/Reim:Deutsch:.*"))["href"] - elif lang == Language.EN: - result_url += soup.find("a", href=re.compile(r"/wiki/Rhymes:English/.*"))["href"] - return result_url - except: + if lang == Language.DE: + pattern = re.compile(r"/wiki/Reim:Deutsch:.*") + elif lang == Language.EN: + pattern = re.compile(r"/wiki/Rhymes:English/.*") + anchor = soup.find("a", href=pattern) + if anchor is not None: + return result_url + anchor["href"] + else: raise ValueError("Entry at {} not found.".format(entry_url)) def find_rhymes(rhymes_url: Url) -> Iterator[str]: soup = cook_soup(rhymes_url) for li in soup.select("div#content ul > li > a"): - try: - yield li.text - except KeyError: - continue + yield li.text if __name__ == "__main__": parser = ArgumentParser(description="Find your rhyme in no time") parser.add_argument("entry", metavar="WORD", type=str, help="the word to rhyme") parser.add_argument("-l", "--lang", help="the language", choices=["de", "en"], nargs="?", default="de") args = parser.parse_args() - - entry = entry_url(args.entry, lang=Language(args.lang)) - rhymes = rhymes_url(entry, lang=Language(args.lang)) - for rhyme in find_rhymes(rhymes): - print(rhyme) + try: + entry = entry_url(args.entry, lang=Language(args.lang)) + rhymes = rhymes_url(entry, lang=Language(args.lang)) + for rhyme in find_rhymes(rhymes): + print(rhyme) + except ValueError as error: + stderr.write("{}\n".format(error))