This repository has been archived by the owner on Dec 20, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunctions.py
63 lines (55 loc) · 2.78 KB
/
functions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from config import log
import re
from urllib import request, error
from bs4 import BeautifulSoup
def get_data(url: str, parser: str = "lxml", headers: dict = None) -> dict[str, bool | str | BeautifulSoup]:
"""
This function downloads and parses content of URL site
:url: address of needed site or directory
:return: dict with elements:
> :"result": *bool* with result of downloading process
> :"content": *BeautifulSoup* with elements if Result is True
OR
*str* with error message if Result is False
"""
cntnt, rslt, msg = "content", "result", "message"
pattern_http = "^http"
m_l = {
"start": "Начинаем загрузку данных с сайта",
"error": "Не удалось получить данные:\n\t>> Адрес:\t%s\n\t>> Ошибка:\t%s",
"get_site": "Пробуем скачать данные с ресурса",
"url_check": "Проверяем, являются ли введенные данные адресом веб-страницы",
"url_correct": "Введен корректный адрес веб-страницы:\t%s",
"path_check": "Проверяем, являются ли введенные данные адресом файла \n\t>> Адрес:\t%s",
"parse": "Пробуем обработать полученные данные",
"agent": "Содержиимое строки headers:\n\t>>\t%s",
"success": "Данные с сайта успешно загружены"
}
log.info(m_l["start"])
log.debug(m_l["url_check"])
if re.match(pattern_http, url):
log.debug(m_l["url_correct"], url)
try:
log.debug(m_l["get_site"])
request_to_site = request.Request(url=url, headers=headers if headers else {})
response = request.urlopen(request_to_site)
except (error.URLError, error.HTTPError) as err:
log.error(m_l["error"], url, err)
log.error(m_l["agent"], headers)
return {rslt: False, cntnt: str(err), msg: 5152}
try:
log.debug(m_l["parse"])
site_data = BeautifulSoup(response, parser)
except error.HTTPError as err:
log.error(m_l["error"], *(url, err))
return {rslt: False, cntnt: str(err), msg: 5152}
else:
log.debug(m_l["path_check"], url)
try:
log.debug(m_l["get_site"])
site_data = BeautifulSoup(open(url), parser)
except (FileNotFoundError, UnicodeDecodeError) as err:
log.error(m_l["error"], *(url, err))
return {rslt: False, cntnt: str(err), msg: 5152}
log.info(m_l["success"])
return {rslt: True, cntnt: site_data, msg: None}