app.site.functions.get_data()   A
last analyzed

Complexity

Conditions 4

Size

Total Lines 37
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 25
dl 0
loc 37
rs 9.28
c 0
b 0
f 0
cc 4
nop 1
1
from __future__ import annotations
2
3
import re
4
from urllib.error import HTTPError
5
from urllib.request import Request, urlopen
6
7
from bs4 import BeautifulSoup
8
9
from app.logger import log
10
11
12
def get_data(url: str) -> str | BeautifulSoup:
13
    """
14
    This function downloads and parses content of URL site
15
    :url: address of needed site or directory
16
    :return: *BeautifulSoup* OR
17
        *str* with error message if Result is False
18
    """
19
    pattern_http = "^http"
20
    m_l = {
21
        "start": "Начинаем загрузку данных с сайта",
22
        "error": "Не удалось получить данные:\n\t>> Адрес:\t%s\n\t>> Ошибка:\t%s",
23
        "get_site": "Пробуем скачать данные с ресурса",
24
        "url_check": "Проверяем, являются ли введенные данные адресом веб-страницы",
25
        "url_correct": "Введен корректный адрес веб-страницы:\t%s",
26
        "parse": "Пробуем обработать полученные данные",
27
        "success": "Данные с сайта успешно загружены",
28
    }
29
30
    log.info(m_l["start"])
31
    log.debug(m_l["url_check"])
32
33
    if not re.match(pattern_http, url):
34
        return ""
35
36
    log.debug(m_l["url_correct"], url)
37
    log.debug(m_l["get_site"])
38
39
    try:
40
        with urlopen(Request(url=url)) as response:
41
            log.debug(m_l["parse"])
42
            soup = BeautifulSoup(response, "lxml")
43
            log.info(m_l["success"])
44
            return soup
45
46
    except HTTPError as err:
47
        log.error(m_l["error"], url, err)
48
        return str(err)
49