_bol.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import requests
  2. from bs4 import BeautifulSoup
  3. from isbnlib.dev import stdmeta
  4. class Book:
  5. LANGUAGE_MAP = {"Engels": "en", "Nederlands": "nl", "Duits": "de"}
  6. def __init__(self, isbn, html):
  7. self.html = html
  8. self.specs = {}
  9. self.isbn = isbn
  10. self.parse_specs()
  11. @property
  12. def title(self):
  13. return self.html.find("h1", class_="pdp-header__title").text.strip()
  14. @property
  15. def authors(self):
  16. return self.specs["Auteur"].split("\n")
  17. @property
  18. def publisher(self):
  19. return self.specs["Uitgever"]
  20. @property
  21. def year(self):
  22. return int(self.specs["Verschijningsdatum"].split(" ")[-1])
  23. @property
  24. def language(self):
  25. lang = self.specs["Taal"]
  26. if lang in self.LANGUAGE_MAP:
  27. return self.LANGUAGE_MAP[lang]
  28. else:
  29. print(f"Warning: language {lang} not found in mapping")
  30. return lang
  31. def as_record(self):
  32. return {"Title": self.title,
  33. "Authors": self.authors,
  34. "Year": self.year,
  35. "Publisher": self.publisher,
  36. "Language": self.language,
  37. "ISBN-13": self.isbn}
  38. def parse_specs(self):
  39. specs_lists = self.html.find_all("dl", class_="specs__list")
  40. for specs_list in specs_lists:
  41. keys = [el.text.strip() for el in specs_list.find_all("dt")]
  42. values = [el.text.strip() for el in specs_list.find_all("dd")]
  43. specs_dict = dict(zip(keys, values))
  44. self.specs.update(specs_dict)
  45. def __str__(self):
  46. return f"""Title: {self.title}
  47. Author: "; ".join({self.authors})
  48. Publisher: {self.publisher}
  49. Year: {self.year}
  50. Language: {self.language}
  51. ISBN: {self.isbn}"""
  52. def __repr__(self):
  53. return self.__str__()
  54. @classmethod
  55. def find(cls, isbn):
  56. url = "https://www.bol.com/nl/rnwy/search.html"
  57. r = requests.get(url, params={"Ntt": isbn})
  58. if r.status_code == 200:
  59. soup = BeautifulSoup(r.text, 'html.parser')
  60. return Book(isbn, soup)
  61. else:
  62. print("Book not found")
  63. return None
  64. def query(isbn):
  65. book = Book.find(isbn)
  66. if book:
  67. return book.as_record()