Handle exception if rhyme url cannot be found

This commit is contained in:
kmein
2018-05-17 16:20:28 +02:00
parent d967b8c44e
commit 9632170cd1

View File

@@ -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))