From 17eeb0ccb81e67690cd1c036bdf0dad643c7b566 Mon Sep 17 00:00:00 2001 From: Ilia Miheev Date: Tue, 21 Oct 2025 21:09:30 +0300 Subject: [PATCH] first commit --- .nojekyll | 0 README.md | 5 ++ _404.md | 3 + _coverpage.md | 16 +++++ _navbar.md | 9 +++ _sidebar.md | 15 +++++ favicon.ico | Bin 0 -> 204482 bytes home.md | 27 +++++++++ index.html | 94 ++++++++++++++++++++++++++++++ pages/en/CsvManager_EN.md | 45 ++++++++++++++ pages/en/JsonManager_EN.md | 34 +++++++++++ pages/en/Pars_EN.md | 78 +++++++++++++++++++++++++ pages/en/ProgressBarManager_EN.md | 66 +++++++++++++++++++++ pages/en/README_EN.md | 27 +++++++++ pages/en/TimerManager_EN.md | 35 +++++++++++ pages/en/ZipManager_EN.md | 33 +++++++++++ pages/en/_sidebar.md | 15 +++++ pages/ru/CsvManager_RU.md | 45 ++++++++++++++ pages/ru/JsonManager_RU.md | 33 +++++++++++ pages/ru/Pars_RU.md | 85 +++++++++++++++++++++++++++ pages/ru/ProgressBarManager_RU.md | 64 ++++++++++++++++++++ pages/ru/TimerManager_RU.md | 35 +++++++++++ pages/ru/ZipManager_RU.md | 33 +++++++++++ pinguin_png.png | Bin 0 -> 4123 bytes styles.css | 11 ++++ 25 files changed, 808 insertions(+) create mode 100644 .nojekyll create mode 100644 README.md create mode 100644 _404.md create mode 100644 _coverpage.md create mode 100644 _navbar.md create mode 100644 _sidebar.md create mode 100644 favicon.ico create mode 100644 home.md create mode 100644 index.html create mode 100644 pages/en/CsvManager_EN.md create mode 100644 pages/en/JsonManager_EN.md create mode 100644 pages/en/Pars_EN.md create mode 100644 pages/en/ProgressBarManager_EN.md create mode 100644 pages/en/README_EN.md create mode 100644 pages/en/TimerManager_EN.md create mode 100644 pages/en/ZipManager_EN.md create mode 100644 pages/en/_sidebar.md create mode 100644 pages/ru/CsvManager_RU.md create mode 100644 pages/ru/JsonManager_RU.md create mode 100644 pages/ru/Pars_RU.md create mode 100644 pages/ru/ProgressBarManager_RU.md create mode 100644 pages/ru/TimerManager_RU.md create mode 100644 pages/ru/ZipManager_RU.md create mode 100644 pinguin_png.png create mode 100644 styles.css diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..c577f3a --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +### Сайт-документация к библиотеке ipars + +~ Навигация по разделам и заголовкам +~ Возможна смена темы (тёмная/светлая) +~ Доступна на двух языках (русский/английский) \ No newline at end of file diff --git a/_404.md b/_404.md new file mode 100644 index 0000000..6fadad4 --- /dev/null +++ b/_404.md @@ -0,0 +1,3 @@ +# Страница не найдена + +Вернись на [главную](/home.md) \ No newline at end of file diff --git a/_coverpage.md b/_coverpage.md new file mode 100644 index 0000000..2d2a6e8 --- /dev/null +++ b/_coverpage.md @@ -0,0 +1,16 @@ + + +![logo](./pinguin_png.png) + +# ipars 3.7.0 + +> Библиотека для работы с файлами во время парсинга + + +- Работает с html, json, csv +- Улучшает UX с помощью прогресс-баров +- Позволяет засекать время работы скрипта +- Архивирует данные по завершении работы + +[GitHub](https://github.com/IliaMiheev/ipars) +[Get Started](#Библиотека-для-работы-с-файлами-во-время-парсинга) diff --git a/_navbar.md b/_navbar.md new file mode 100644 index 0000000..bc55449 --- /dev/null +++ b/_navbar.md @@ -0,0 +1,9 @@ + + +* Languages + + * [Русский](./home.md) + * [English](./pages/en/README_EN.md) + +* [GitHub](https://github.com/IliaMiheev/ipars) +* [Pypi](https://pypi.org/project/ipars/) diff --git a/_sidebar.md b/_sidebar.md new file mode 100644 index 0000000..324222e --- /dev/null +++ b/_sidebar.md @@ -0,0 +1,15 @@ + + +* [**Главная**](./home.md) + +* [**Pars**](./pages/ru/Pars_RU.md) + +* [**JsonManager**](./pages/ru/JsonManager_RU.md) + +* [**CsvManager**](./pages/ru/CsvManager_RU.md) + +* [**ProgressBar**](./pages/ru/ProgressBarManager_RU.md) + +* [**TimerManager**](./pages/ru/TimerManager_RU.md) + +* [**ZipManager**](./pages/ru/ZipManager_RU.md) diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5704ad2cfe554d49e4eca7d6050923d1cb13d589 GIT binary patch literal 204482 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�DZ@BPa9l@)A8bjWrpdKx&GuTt=NI_V2 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%0AEy5fJ-# zoydP`%9JD1nh+PCM_9Q6-V#Q+yy+)iT5PzKs!jM5ib0B00c|xuTNsDGG44Ht>_g!D zWx-ox*fav@F@Vi>J%jh<3hR@Zisn*^v$>r}&q+ypQk^gC5+^w^fyzqvqpQsW z7Rb?8#^LM6#!04mOhn~~iXzlSlc`qS1EPEpp-IcaYX&EtDB>k|)u`wQGP^t~zN9@B z-aKtJpA7)5Cx$!m4$c^yKV)u(uVnfrP(?pZ?-y!jSEGS5{OiV)6`TP=FEt@A82^=N zUAX!1h4AJYd@_yp|c82(5Lw}W|>`zs|dgBRjrCLw$U~IwrRz62(d_wgR3Z$2r9KVqf^%0A{0aw7jD2FuxzKhSUfiSgmDm2rb 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 + + + + + Документация ipars + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Секундочку...
+ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/en/CsvManager_EN.md b/pages/en/CsvManager_EN.md new file mode 100644 index 0000000..7ae688c --- /dev/null +++ b/pages/en/CsvManager_EN.md @@ -0,0 +1,45 @@ +### Working with CsvManager + +This class is designed to write and extract information from csv files + +The CsvManager class takes three arguments: the newline character newline (default is an empty string), the encoding of the opened files encoding (default is UTF-8), and the delimiter used in the CSV file delimiter (default is ";"). + +```py + +from ipars import CsvManager + +c = CsvManager() +``` + +### Brief Overview of CsvManager Methods + +1. The **writerow** method writes a row to the CSV file. The method takes the path to the CSV file, the write mode, and a list of data that will be written to the file's row. + +2. The **writerows** method takes the same arguments as writerow, but the row must be a double list with data for writing. The difference between these methods is that writerow writes one row, while writerows writes as many as there are in the double list. + +3. The **getRows** method is used to retrieve a list of rows in the CSV file. The method takes the path to the file from which the rows will be obtained. + +4. The **pprint** method is the same as that of Pars. + +### Example of Using CsvManager + +```py +from ipars import CsvManager +c = CsvManager() + +# writing headers +writer = c.writerow('./data.csv', 'w', ['Quantity', 'Price', 'Total']) + +# writing data +writer = c.writerows('./data.csv', 'a', [ +["5", "5", "25"], +["6", "6", "36"], +["7", "7", "49"], +]) + +# retrieving rows from the table +rows = c.getRows('./data.csv') + +# printing table rows +c.pprint(rows) +``` diff --git a/pages/en/JsonManager_EN.md b/pages/en/JsonManager_EN.md new file mode 100644 index 0000000..4a60786 --- /dev/null +++ b/pages/en/JsonManager_EN.md @@ -0,0 +1,34 @@ +### Working with JsonManager + +This class is designed to write and extract information from json files. + +JsonManager takes only one argument — the encoding in which the files will be read. The default is UTF-8. + +```py +from ipars import JsonManager + +j = JsonManager() +``` + +### Brief Overview of JsonManager Methods + +1. The **load** method is used to retrieve data from a JSON file at the specified path. + +2. The **dump** method is used to write data to a JSON file. It takes the path to the file and the data to be written. + +3. The **pprint** method is the same as that of Pars. + +### Example of Using JsonManager + +```py + +from ipars import JsonManager +j = JsonManager() + +# Writing data +j.dump('./data.json', [1, 2, 3, 4, 5, 6, 7]) + +# Retrieving data +data = j.load('./data.json') +j.pprint(data) # [1, 2, 3, 4, 5, 6, 7] +``` diff --git a/pages/en/Pars_EN.md b/pages/en/Pars_EN.md new file mode 100644 index 0000000..c26451d --- /dev/null +++ b/pages/en/Pars_EN.md @@ -0,0 +1,78 @@ +### Working with Pars + +This class is designed to work with requests and the resulting html page. + +The Pars class does not take any arguments for its constructors. + +```python +from ipars import Pars + +p = Pars() +``` + +### Brief Overview of Pars Methods + +1. The **getStaticPage** method takes the URL of the page, the path where the page will be saved, the write method, and request headers. The "wb" write method is used for saving images; by default, the write method is set to "w", which is used for HTML pages. If request headers are not specified, random user-agent headers will be used. The method returns the status response from the website, which should be used for conducting checks. +2. The **getDynamicPage** method uses the Selenium library to get a dynamically updated page. This is useful when content on the page loads dynamically. It takes the URL of the page, the save path, closeWindow, and timeSleep. By default, the Selenium browser opens in the background, and its operation is not visible, but if closeWindow is set to False, the code execution process will be shown. The timeSleep parameter can extend the page load time if content takes long to load. +3. The **gpsa** (get page semi-automatically) method is similar to the getDynamicPage method but works in a semi-automatic mode. It opens the webpage and waits until Enter is pressed in the terminal. During this time, you can register on the site and/or switch to the desired tab on the site, after which pressing Enter will allow the method to parse the page. This is suitable for social media feeds where unauthorized users have limited access to content. It accepts the same arguments and serves the same purposes as getDynamicPage, except for closeWindow. +4. The **returnBs4Object** method returns a BeautifulSoup object. It takes the path to the HTML page, converts its contents into a BeautifulSoup object, the file open encoding (default is UTF-8), and the parser type (default is lxml). +5. The **getAttributes** method is used to retrieve a list of attributes from a list of BeautifulSoup objects. It takes a list of BeautifulSoup objects and the name of the attribute to be extracted from the elements of the list. +6. The **getTexts** method is used to retrieve a list of text from a list of BeautifulSoup objects. It takes a list of BeautifulSoup objects and the needFix parameter. If this parameter is set to True, \n, \t, and spaces from the ends will be removed from the text. +7. The **pprint** method is used for displaying variable values that have a high level of nesting. For example, if you have an array of objects, where another array of objects is used as the value of a key. +8. The **mkdir** method is used to create a directory with the name nameDir if it does not already exist. + +### Example Parser Using ipars: + +```py +# Read about the ProgressBarManager class below +from ipars import Pars, ProgressBarManager +p = Pars() +nameFile = 'index.html' + +# Getting the HTML page +p.getDynamicPage(nameFile, 'https://duckduckgo.com/?q=greenhouse+social+technologies+youtube&iar=videos&atb=v454-1', closeWindow=0) + +# Getting the BeautifulSoup object +soup = p.returnBs4Object(nameFile) + +# Finding all answer cards +# The first results are those we want, while the rest are not. Therefore, we want the first 84 elements +allCards = soup.find*all(class*='b_NgmZrVnRtV8MZMEjLs')[:84] + +# Getting all images +allImg = [card.find('img') for card in allCards] + +# Getting all links +allSrc = p.getAttributes(allImg, 'src') + +# Creating the img folder if it doesn't already exist +nameFolder = 'img' +p.mkdir(nameFolder) + +# Creating a ProgressBarManager object +bar = ProgressBarManager(len(allSrc)) + +# Downloading images +for index, url in enumerate(allSrc): +url = 'https:' + url +p.getStaticPage(f'./{nameFolder}/img{index}.png', url, writeMethod='wb') +bar.next() +bar.finish() +``` + +### Example Using getAttributes and getTexts Methods + +```py +from ipars import Pars +p = Pars() + +p.getStaticPage('./index.html', 'https://google.com') +soup = p.returnBs4Object('./index.html') + +allTegA = soup.find_all('a') +a1 = p.getTexts(allTegA, needFix=1) +p.pprint(a1) + +a2 = p.getAttributes(allTegA, 'href') +p.pprint(a2) +``` diff --git a/pages/en/ProgressBarManager_EN.md b/pages/en/ProgressBarManager_EN.md new file mode 100644 index 0000000..b725944 --- /dev/null +++ b/pages/en/ProgressBarManager_EN.md @@ -0,0 +1,66 @@ +### Working with ProgressBarManager + +The class creates a progress bar for better visibility of code execution. It takes five arguments: + +1. **max**: a required parameter that indicates the maximum number of iterations in the progress bar. + +2. **message**: a message displayed before the progress bar. + +3. **color**: the color of the progress bar. + +4. **fill**: a character used to fill the completed portion. + +5. **width**: the size of the progress bar in characters. + +```py + +from ipars import ProgressBarManager + +bar = ProgressBarManager(100) # Here max is set to 100 +``` + +### Brief Overview of ProgressBarManager Methods + +1. The **next** method starts the next iteration of the progress bar. + +2. The **finish** method completes the progress bar. + +### Example of Using ProgressBarManager + +```py +# Importing libraries +from ipars import ProgressBarManager +from time import sleep + +maxValue = 300 + +# Creating a default progress bar +bar = ProgressBarManager(maxValue) + +# Simulating work +for _ in range(maxValue // 2): +sleep(0.1) +bar.next() + +# Turning off the progress bar +bar.finish() + +# Creating a more customized progress bar +bar = ProgressBarManager( +maxValue, +message='Downloading process', +color='red', +fill='\*', +width=50 +) + +# Simulating work + +for _ in range(maxValue): +sleep(0.1) +bar.next() + +# Turning off the progress bar + +bar.finish() +``` diff --git a/pages/en/README_EN.md b/pages/en/README_EN.md new file mode 100644 index 0000000..53d5843 --- /dev/null +++ b/pages/en/README_EN.md @@ -0,0 +1,27 @@ +### Library for File Handling During Parsing {docsify-ignore-all} + +During parsing, it is often necessary to download HTML pages and work with JSON and CSV files. This library is designed to simplify the coding tasks for such activities and provides a range of additional features. + +### The library contains three primary classes + +1. **Pars** for handling requests and bs4. +2. **JsonManager** for working with JSON. +3. **CsvManager** for handling CSV files. + +### There are also three auxiliary classes + +1. **ProgressBarManager** for creating progress bars. +2. **TimerManager** for measuring the execution time of specific code. +3. **ZipManager** for archiving files and folders. + +To install the library: + +```bash +pip install ipars +``` + +or + +```bash +pip3 install ipars +``` diff --git a/pages/en/TimerManager_EN.md b/pages/en/TimerManager_EN.md new file mode 100644 index 0000000..0a5332f --- /dev/null +++ b/pages/en/TimerManager_EN.md @@ -0,0 +1,35 @@ +### Working with TimerManager + +The TimerManager class is designed to track the execution time of code. It allows you to obtain the total runtime in various formats. + +```py +from ipars import TimerManager + +t = TimerManager() +``` + +### Brief Overview of TimerManager Methods + +1. The **start** method marks the starting point of the time measurement. + +2. The **end** method marks the endpoint of the time measurement. + +3. The **getWorkTime** method returns the total execution time in the specified format. Supported formats are seconds, minutes, and hours. The ndigits parameter specifies the number of decimal places for rounding; by default, the number is not rounded. + +### Example of Using TimerManager + +```py +from time import sleep +from ipars import TimerManager +t = TimerManager() + +# Starting the timer +t.start() +sleep(2) # simulating two seconds of work +t.end() + +# Displaying results in different formats +print(f"Execution time in seconds: {t.getWorkTime()}") # 2.0008320808410645 +print(f"Execution time in minutes: {t.getWorkTime(ndigits=2, format='minutes')}") # 0.03 +print(f"Execution time in hours: {t.getWorkTime(ndigits=4, format='hours')}") # 0.0006 +``` diff --git a/pages/en/ZipManager_EN.md b/pages/en/ZipManager_EN.md new file mode 100644 index 0000000..afc58ef --- /dev/null +++ b/pages/en/ZipManager_EN.md @@ -0,0 +1,33 @@ +### Working with ZipManager + +The ZipManager class is used for archiving a folder of files. It takes only one argument — the compression level for the files. + +'none' => No compression + +'normal' => Normal compression + +'hard' => Increased compression + +'maximum' => Maximum compression + +```py +from ipars import ZipManager + +z = ZipManager() +``` + +### Brief Overview of ZipManager Methods + +1. The **zip_file** method is used to archive a single file. It takes the path to the source file and the path to the output file. +2. The **zip_folder** method is used to archive a directory. It takes the path to the source directory and the path to the output file. + +### Example of Using ZipManager + +```py + +from ipars import ZipManager +z = ZipManager(compression='maximum') + +z.zip_file('./your_file.txt', 'file_archive_maximum.zip') +z.zip_folder('./your_folder/', 'folder_archive_maximum.zip') +``` diff --git a/pages/en/_sidebar.md b/pages/en/_sidebar.md new file mode 100644 index 0000000..eee0c93 --- /dev/null +++ b/pages/en/_sidebar.md @@ -0,0 +1,15 @@ + + +* [**Home**](./pages/en/README_EN.md) + +* [**Pars**](./pages/en/Pars_EN.md) + +* [**JsonManager**](./pages/en/JsonManager_EN.md) + +* [**CsvManager**](./pages/en/CsvManager_EN.md) + +* [**ProgressBar**](./pages/en/ProgressBarManager_EN.md) + +* [**TimerManager**](./pages/en/TimerManager_EN.md) + +* [**ZipManager**](./pages/en/ZipManager_EN.md) diff --git a/pages/ru/CsvManager_RU.md b/pages/ru/CsvManager_RU.md new file mode 100644 index 0000000..c13cc21 --- /dev/null +++ b/pages/ru/CsvManager_RU.md @@ -0,0 +1,45 @@ +### Работа с CsvManager + +Данный класс предназначен для записи и извлечения информации из csv-файлов. + + +Класс CsvManager принимает три аргумента: символ переноса на новую строку _newline_ (по умолчанию — это пустая строка), кодировку открываемых файлов _encoding_ (по умолчанию UTF-8) и разделитель который используется в csv файле _delimiter_ (по умолчанию ";") + +```py +from ipars import CsvManager + +c = CsvManager() +``` + +### Коротко о методах CsvManager + +1. Метод **writerow** записывает строку с csv файл. Метод принимает путь до csv файла, метод записи и список данных которые будут записанн в строку файла + +2. Метод **writerows** принимает теже самые аргументы что и writerow, только row должен быть двойным списком с данными для записи. Разница между этими методами в том что writerow записывает одну, а writerows столько сколько есть в двойном списке + +3. Метод **getRows** используется для получения списка строк в csv файле. Метод принимает путь до файла откуда будут получены строки + +4. Метод **pprint** такой же как и у Pars + +### Пример использования CsvManager + +```py +from ipars import CsvManager +c = CsvManager() + +# записываем заголовки +writer = c.writerow('./data.csv', 'w', ['Количество', 'Цена', 'Итог']) + +# записываем данные +writer = c.writerows('./data.csv', 'a', [ + ["5", "5", "25"], + ["6", "6", "36"], + ["7", "7", "49"], +]) + +# получаем строки из таблицы +rows = c.getRows('./data.csv') + +# выводим строки таблицы +c.pprint(rows) +``` diff --git a/pages/ru/JsonManager_RU.md b/pages/ru/JsonManager_RU.md new file mode 100644 index 0000000..f632ce9 --- /dev/null +++ b/pages/ru/JsonManager_RU.md @@ -0,0 +1,33 @@ +### Работа с JsonManager + +Данный класс предназначен для записи и извлечения информации из json-файлов. + +JsonManager принимает принимает только один аргумент — кодировку в которой будут читаться файлы. По умолчанию это UTF-8 + +```py +from ipars import JsonManager + +j = JsonManager() +``` + +### Коротко о методах JsonManager + +1. Метод **load** используется для получения данных из json-файла по указанному пути + +2. Метод **dump** используется для записи данных в json-файл. Принимает путь до файла и данные для записи + +3. Метод **pprint** такой же как и у Pars + +### Пример использования JsonManager + +```py +from ipars import JsonManager +j = JsonManager() + +# Записываем данные +j.dump('./data.json', [1, 2, 3, 4, 5, 6, 7]) + +# Получаем данные +data = j.load('./data.json') +j.pprint(data) # [1, 2, 3, 4, 5, 6, 7] +``` diff --git a/pages/ru/Pars_RU.md b/pages/ru/Pars_RU.md new file mode 100644 index 0000000..4bb2d1e --- /dev/null +++ b/pages/ru/Pars_RU.md @@ -0,0 +1,85 @@ +### Работа с Pars + +Данный класс предназначен для работы с запросами и полученной html-страницей. + +Класс Pars не принимает никаких данных для конструкторов. + +```python +from ipars import Pars + +p = Pars() +``` + +### Коротко о методах Pars: + +1. Метод **getStaticPage** принимает url страницы, путь, по которому сохранится страница, метод записи и заголовки запроса. Метод записи «wb» используется для сохранения картинок, по умолчанию writeMethod установлен как «w», что используется для html-страниц. Если заголовки запросов не указаны, то будут использоваться заголовки со случайным user-agent. Метод возвращает статус ответа сайта, что должно использоваться для введения проверок + +2. Метод **getDynamicPage** с помощью библиотеки Selenium получает динамически обновляемую страницу. Это помогает, когда контент на странице подгружается динамически. Принимает url страницы, путь сохранения, closeWindow и timeSleep. По умолчанию браузер Selenium открывается в фоновом режиме, и работу браузера не видно, но если closeWindow указать как False, то будет виден процесс выполнения кода. С помощью timeSleep можно увеличить время загрузки страницы если контент на ней долго подгружается + +3. Метод **gpsa** (get page semi-automatically) похож на метод getDynamicPage, но работает в полуавтоматическом режиме. Он открывает страницу сайта и ждёт пока не будет нажат Enter в терминале. В этот момент можно зарегистрироваться на сайте и/или перейти на нужную вкладку сайта, после чего нажать Enter и метод спарсит страницу. Подходит для лент соцсетей, где неавторизованным пользователям контент ограничен. Принисает такие же аргументы для таких же целей, что и getDynamicPage, за исключением closeWindow + +4. Метод **returnBs4Object** возвращает объект beautifulsoup4. Принимает путь до html-страницы, содержимое которой преобразует в объект beautifulsoup, кодировку открытия файла (по умолчанию UTF-8) и тип парсера (по умолчанию lxml). + +5. Метод **getAttributes** нужена чтобы получить список атрибутов из списка объектов bs4. Принимает список объектов bs4 и название атрибута который будет извлекаться из элементов списка + +6. Метод **getTexts** нужена чтобы получить список текста из списка объектов bs4. Принимает список объектов bs4 и параметр needFix. Если этот параметр установлен как True, то из текста будут удалены \n, \t и пробелы с концов + +7. Метод **pprint** используется для вывода значений переменных у которых большая вложеность. Например, если у Вас есть массив объектов, где в качестве значения ключа используется другой массив объектов + +8. Метод **mkdir** используется для создания папки с именем _nameDir_ если она ещё не существует + +### Пример парсера с использованием ipars: + +```py +# О классе ProgressBarManager читай ниже +from ipars import Pars, ProgressBarManager +p = Pars() +nameFile = 'index.html' + +# Получаем html страницу +p.getDinamicPage(nameFile, 'https://duckduckgo.com/?q=теплица+социальных+технологий+youtube&iar=videos&atb=v454-1', closeWindow=0) + +# Получаем объект BautifullSoup +soup = p.returnBs4Object(nameFile) + +# Находим все карточки ответов +# Первые результаты выдачи те что хотелось получить, а остальные нет. Поэтому нам желательно получить первые 84 элемента +allCards = soup.find_all(class_='b_NgmZrVnRtV8MZMEjLs')[:84] + +# Получаем все изображения +allImg = [card.find('img') for card in allCards] + +# Получаем все ссылки +allSrc = p.getAttributes(allImg, 'src') + +# Создаём папку img если её ещё нет +nameFolder = 'img' +p.mkdir(nameFolder) + +# Создаём объект ProgressBarManager +bar = ProgressBarManager(len(allSrc)) + +# Скачиваем картинки +for index, url in enumerate(allSrc): + url = 'https:' + url + p.getStaticPage(f'./{nameFolder}/img{index}.png', url, writeMethod='wb') + bar.next() +bar.finish() +``` + +### Пример использования методов _getAttributes_ и _getTexts_ + +```py +from ipars import Pars +p = Pars() + +p.getStaticPage('./index.html', 'https://google.com') +soup = p.returnBs4Object('./index.html') + +allTegA = soup.find_all('a') +a1 = p.getTexts(allTegA, needFix=1) +p.pprint(a1) + +a2 = p.getAttributes(allTegA, 'href') +p.pprint(a2) +``` diff --git a/pages/ru/ProgressBarManager_RU.md b/pages/ru/ProgressBarManager_RU.md new file mode 100644 index 0000000..34a0283 --- /dev/null +++ b/pages/ru/ProgressBarManager_RU.md @@ -0,0 +1,64 @@ +### Работа с ProgressBarManager + +Класс создаёт прогресс-бар для лучшей видимости выполнения кода. Принимает пять аргументов: + +1. **max**: обязательный параметр, который указывает максимальное значение итераций в прогресс-баре + +2. **message**: сообщение перед прогресс-баром + +3. **color**: цвет прогресс-бара + +4. **fill**: заполнитель для сделанной части + +5. **width**: размер прогресс-бара в символах + +```py +from ipars import ProgressBarManager + +bar = ProgressBarManager(100) # Здесь max установлен как 100 +``` + +### Коротко о методах ProgressBarManager + +1. Метод **next** запускает следущую итерацию прогресс-бара + +2. Метод **finish** завершает работу прогресс-бара + +### Пример использования ProgressBarManager + +```py +# Импортируем библиотеки +from ipars import ProgressBarManager +from time import sleep + +maxValue = 300 +# Создаём прогресс-бар по умолчанию +bar = ProgressBarManager(maxValue) + +# Имитируем работу +for _ in range(maxValue//2): + sleep(0.1) + bar.next() + +# Выключаем прогресс-бар +bar.finish() + + + +# Создаём более кастомизированный прогресс-бар +bar = ProgressBarManager( + maxValue, + message='Процесс скачивания', + color='red', + fill='*', + width=50 +) + +# Имитируем работу +for _ in range(maxValue): + sleep(0.1) + bar.next() + +# Выключаем прогресс-бар +bar.finish() +``` diff --git a/pages/ru/TimerManager_RU.md b/pages/ru/TimerManager_RU.md new file mode 100644 index 0000000..7a3fb86 --- /dev/null +++ b/pages/ru/TimerManager_RU.md @@ -0,0 +1,35 @@ +### Работа с TimerManager + +Класс TimerManager предназначен для отслеживания времени выполнения кода. Он позволяет получить общее время работы в различных форматах. + +```py +from ipars import TimerManager + +t = TimerManager() +``` + +### Коротко о методах TimerManager + +1. Метод **start** — точка начала отсчёта времени + +2. Метод **end** — конечная точка отсчёта времени + +3. Метод **getWorkTime** возвращает общее время работы в указанном формате. Поддерживаемые форматы: _seconds_, _minutes_, _hours_. Параметр _ndigits_ указывает количество знаков после запятой для округления, по умолчанию число не округляется. + +### Пример использования TimerManager + +```py +from time import sleep +from ipars import TimerManager +t = TimerManager() + +# Засекаем время +t.start() +sleep(2) # имитация двухсекундной работы +t.end() + +# Выводим результат в разных форматах +print(f"Время работы в секундах: {t.getWorkTime()}") # 2.0008320808410645 +print(f"Время работы в минутах: {t.getWorkTime(ndigits=2, format='minutes')}") # 0.03 +print(f"Время работы в часах: {t.getWorkTime(ndigits=4, format='hours')}") # 0.0006 +``` diff --git a/pages/ru/ZipManager_RU.md b/pages/ru/ZipManager_RU.md new file mode 100644 index 0000000..8efb5d6 --- /dev/null +++ b/pages/ru/ZipManager_RU.md @@ -0,0 +1,33 @@ +### Работа с ZipManager + +Класс ZipManager нужен для архивации папоки файлов. Он принимает принимает только один аргумент — уровень сжатия файлов. + +'none' => Без сжатия + +'normal' => Обычное сжатие + +'hard' => Увеличенное сжатие + +'maximum' => Максимальное сжатие + +```py +from ipars import ZipManager + +z = ZipManager() +``` + +### Коротко о методах ZipManager + +1. Метод **zip_file** используется для архивирования одного файла. Принимает путь до исходного файла и путь выходного файла + +2. Метод **zip_folder** используется для архивирования каталога. Принимает путь до исходного каталога и путь выходного файла + +### Пример использования ZipManager + +```py +from ipars import ZipManager +z = ZipManager(compression='maximum') + +z.zip_file('./your_file.txt', 'file_archive_maximum.zip') +z.zip_folder('./your_folder/', 'folder_archive_maximum.zip') +``` diff --git a/pinguin_png.png b/pinguin_png.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9b87c91d907ce96879aa6a09e1bc6f4368a906 GIT binary patch literal 4123 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 A761SM literal 0 HcmV?d00001 diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..1630b07 --- /dev/null +++ b/styles.css @@ -0,0 +1,11 @@ +#docsify-darklight-theme { + right: 5px; +} + +a:visited { + color: inherit; /* Убирает изменение цвета для посещенной ссылки */ +} + +.clear-button.show svg{ + margin-top: 8px; +}