Passed
Push — master ( de23cd...8a736d )
by torrua
01:18
created

app.site.functions.get_data()   A

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