Handle exception if rhyme url cannot be found
This commit is contained in:
39
rilke.py
39
rilke.py
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user