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 argparse import ArgumentParser
from enum import Enum
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from enum import Enum
from sys import stderr
from typing import Iterator, NewType
import re import re
import requests import requests
from typing import Iterator, NewType
Url = NewType("Url", str)
class Language(Enum): class Language(Enum):
EN = "en" EN = "en"
DE = "de" DE = "de"
DEFAULT_LANG = Language.DE DEFAULT_LANG = Language.DE
Url = NewType("Url", str)
def cook_soup(url: Url) -> BeautifulSoup: def cook_soup(url: Url) -> BeautifulSoup:
return BeautifulSoup(requests.get(url).text, "lxml") 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: def rhymes_url(entry_url: Url, lang: Language = DEFAULT_LANG) -> Url:
soup = cook_soup(entry_url) soup = cook_soup(entry_url)
result_url = base_url(lang) result_url = base_url(lang)
try: if lang == Language.DE:
if lang == Language.DE: pattern = re.compile(r"/wiki/Reim:Deutsch:.*")
result_url += soup.find("a", href=re.compile(r"/wiki/Reim:Deutsch:.*"))["href"] elif lang == Language.EN:
elif lang == Language.EN: pattern = re.compile(r"/wiki/Rhymes:English/.*")
result_url += soup.find("a", href=re.compile(r"/wiki/Rhymes:English/.*"))["href"] anchor = soup.find("a", href=pattern)
return result_url if anchor is not None:
except: return result_url + anchor["href"]
else:
raise ValueError("Entry at {} not found.".format(entry_url)) raise ValueError("Entry at {} not found.".format(entry_url))
def find_rhymes(rhymes_url: Url) -> Iterator[str]: def find_rhymes(rhymes_url: Url) -> Iterator[str]:
soup = cook_soup(rhymes_url) soup = cook_soup(rhymes_url)
for li in soup.select("div#content ul > li > a"): for li in soup.select("div#content ul > li > a"):
try: yield li.text
yield li.text
except KeyError:
continue
if __name__ == "__main__": if __name__ == "__main__":
parser = ArgumentParser(description="Find your rhyme in no time") 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("entry", metavar="WORD", type=str, help="the word to rhyme")
parser.add_argument("-l", "--lang", help="the language", choices=["de", "en"], nargs="?", default="de") parser.add_argument("-l", "--lang", help="the language", choices=["de", "en"], nargs="?", default="de")
args = parser.parse_args() args = parser.parse_args()
try:
entry = entry_url(args.entry, lang=Language(args.lang)) entry = entry_url(args.entry, lang=Language(args.lang))
rhymes = rhymes_url(entry, lang=Language(args.lang)) rhymes = rhymes_url(entry, lang=Language(args.lang))
for rhyme in find_rhymes(rhymes): for rhyme in find_rhymes(rhymes):
print(rhyme) print(rhyme)
except ValueError as error:
stderr.write("{}\n".format(error))