parser.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # Parser Vedabase
  2. from bs4 import BeautifulSoup as bs
  3. import bs4
  4. import requests
  5. import time
  6. def __get_soup(url) -> bs4.BeautifulSoup:
  7. '''Returns soup from site page'''
  8. while True: # повтор запроса к странице после ожидания, если сервер закрыает соединение
  9. try:
  10. r = requests.get(url)
  11. except requests.exceptions.RequestException:
  12. time.sleep(30)
  13. else:
  14. break
  15. r.encoding = 'utf-8'
  16. return bs(r.text, 'html.parser')
  17. def __construct_link(query: str) -> dict:
  18. basic_url = 'https://vedabase.io'
  19. books = ['bg', 'sb']
  20. try:
  21. book_name, verse_number = query.split(" ")
  22. except ValueError:
  23. return {"error": "Не правильный формат указания стиха"}
  24. if book_name not in books:
  25. return {"error": "Книга указана не правильно. Введите одно из\
  26. bg, sb"}
  27. return {
  28. "link": basic_url + f"/ru/library/{book_name}/{verse_number.replace('.', '/')}"
  29. }
  30. # getting data
  31. def get_full_verse(query: str) -> dict:
  32. """Получает текст стиха или нескольких стихов. Возвражает в объекте, жанные о стихе и в массиве тексты нескольких стихов"""
  33. verses = []
  34. parsed_query = __construct_link(query)
  35. if 'error' in parsed_query:
  36. return {'error': parsed_query['error']}
  37. url = parsed_query['link']
  38. soup = __get_soup(url)
  39. title = soup.title.text
  40. if title == '':
  41. return {'error': [f'Стих либо не найден либо какая-то другая ошибка']}
  42. title = title.replace('Бг.', 'Бхагавад-гита')
  43. try:
  44. verse_text = soup.find(
  45. 'div', class_='wrapper-verse-text').find_all(class_='r-verse-text')
  46. if len(verse_text) > 1:
  47. verse_number = int(title.split('.')[-1].split('-')[0])
  48. title_template = ".".join(title.split('.')[:-1])
  49. for v in verse_text:
  50. text = v.get_text('\n', strip=True)
  51. verses.append({
  52. "text": text,
  53. "title": f"{title_template}.{verse_number}",
  54. "alias": f"{'.'.join(query.split('.')[:-1])}.{verse_number}"
  55. })
  56. verse_number += 1
  57. else:
  58. verses.append({
  59. "text": verse_text[0].get_text('\n', strip=True),
  60. "title": title,
  61. "alias": query})
  62. except Exception:
  63. return {'error': ['Не найдено']}
  64. with open('lastverse', 'w') as f:
  65. f.write(query)
  66. return {
  67. 'link': url,
  68. 'verses': verses,
  69. }