Pythoner
Open in Telegram
Полезные материалы по Python, которые будут интересны опытному и начинающему разработчику. Сотрудничество - @flattys Цены - @serpent_media Канал на бирже: https://telega.in/c/pythonercode
Show more6 621
Subscribers
+124 hours
-27 days
-3130 days
Posts Archive
6 622
✈️Сегодня поговорим о том, как создавать крутые CLI-приложения с помощью Click. Если вам надоело писать бесконечные if'ы для обработки аргументов командной строки, то этот пост определенно для вас!
➡️Начнем с того, почему вообще стоит использовать Click, а не встроенный argparse:
—Декораторный подход, который выглядит элегантно и интуитивно понятен
—Автоматическая генерация справки и сообщений об ошибках
—Вложенные команды из коробки
—Поддержка автодополнения в shell
➡️Давайте посмотрим на простой, но реальный пример. Представим, что мы делаем утилиту для работы с файлами:
import click
@click.group()
def cli():
"""Утилита для работы с файлами"""
pass
@cli.command()
@click.argument('path')
@click.option('--lines', '-l', is_flag=True, help='Показать количество строк')
def analyze(path, lines):
"""Анализирует файл и выводит статистику"""
try:
with open(path) as f:
content = f.readlines()
if lines:
click.echo(f'Количество строк: {len(content)}')
except FileNotFoundError:
click.secho('Файл не найден! 😱', fg='red')
if __name__ == '__main__':
cli()
Крутая штука в Click – это то, как легко добавлять новые команды. Хотите добавить подкоманду? Просто навешиваете еще один декоратор!
➡️А теперь лайфхак, который многие упускают: Click умеет создавать красивые прогресс-бары:
@cli.command()
@click.argument('path')
def process(path):
"""Обрабатывает файлы с прогресс-баром"""
files = os.listdir(path)
with click.progressbar(files, label='Обработка файлов') as bar:
for f in bar:
# что-то делаем с файлом
time.sleep(0.1)
➡️Про что еще стоит знать?
Click отлично работает с цветным выводом. Хотите привлечь внимание пользователя? Используйте click.secho():
click.secho('Внимание! 🚨', fg='yellow', bold=True)
click.secho('Ошибка! ❌', fg='red')
click.secho('Успех! ✅', fg='green')
➡️И напоследок, трюк – создание интерактивных подтверждений:
if click.confirm('Уверены, что хотите удалить все файлы? 🤔'):
click.echo('Поехали! 🚀')
📂Документация
🐍 Pythoner6 622
✈️ В Python модуль `concurrent.futures` предоставляет высокоуровневый интерфейс для асинхронного выполнения вызовов функций, используя пул потоков или процессов. Он упрощает распараллеливание задач и позволяет эффективно использовать многоядерные процессоры для ускорения выполнения программ.
➡️ Применение
concurrent.futures особенно полезно при работе с I/O-bound задачами, такими как сетевые запросы, чтение/запись файлов, взаимодействие с базами данных. Он также может быть эффективен для CPU-bound задач, если они могут быть разделены на независимые подзадачи.
➡️ Вот пример использования concurrent.futures с ThreadPoolExecutor:
import concurrent.futures
import time
import requests
URLS = [
"https://www.example.com",
"https://www.google.com",
"https://www.python.org",
"https://www.wikipedia.org",
]
def load_url(url, timeout):
try:
response = requests.get(url, timeout=timeout)
return f"{url}: {len(response.content)} bytes"
except requests.exceptions.RequestException as e:
return f"{url}: Error: {e}"
start_time = time.time()
# Последовательное выполнение:
for url in URLS:
print(load_url(url, timeout=60))
end_time = time.time()
print(f"Последовательное выполнение заняло: {end_time - start_time} секунд")
start_time = time.time()
# Асинхронное выполнение с ThreadPoolExecutor:
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
# map() возвращает результаты в порядке URLS
future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print(f"{url}: generated an exception: {exc}")
else:
print(data)
end_time = time.time()
print(f"Асинхронное выполнение заняло: {end_time - start_time} секунд")
⬆️ В этом примере демонстрируется загрузка содержимого нескольких URL-адресов сначала последовательно, а затем асинхронно с использованием ThreadPoolExecutor. Функция load_url загружает данные по указанному URL. ThreadPoolExecutor создает пул потоков, которые выполняют загрузку URL-адресов параллельно. as_completed позволяет обрабатывать результаты по мере их готовности, не дожидаясь завершения всех задач. Сравнение времени выполнения показывает преимущество асинхронного подхода, особенно при работе с сетевыми запросами.
🐍 Pythoner6 622
Подпишитесь на наш Telegram-канал!
В Telegram-канале VK Рекламы мы делимся:
- успешными кейсами таргетологов и предпринимателей;
- пошаговыми инструкциями по настройке кампаний;
- бесплатными обучающими курсами и вебинарами;
- рекламными форматами и инструментами, которые помогут повысить эффективность кампаний.
📅 А ещё анонсируем бесплатные марафоны и офлайн-конференции для разных сфер бизнеса!
Подписывайтесь! У нас тут много обучающего контента, который научит любого грамотно пользоваться кабинетом VK Рекламы и настраивать эффективные рекламные кампании.
Подписаться
#реклама 16+
О рекламодателе
6 622
✈️ В Python модуль `difflib` — это мощный инструмент для сравнения последовательностей, таких как строки, списки и другие итерируемые объекты. Он предоставляет классы и функции для вычисления различий между последовательностями, что позволяет эффективно находить и отображать изменения, например, в текстовых файлах или других данных.
➡️ Применение
difflib разнообразно: от сравнения версий файлов и поиска плагиата до создания патчей и слияния изменений в системах контроля версий. Он также может быть полезен для анализа текстовых данных, например, для выявления изменений в документах или сравнения ответов пользователей.
➡️ Вот пример использования difflib для сравнения двух строк:
import difflib
text1 = """
This is the first line.
This is the second line.
This is the third line.
"""
text2 = """
This is the first line.
This is the modified second line.
This is the fourth line.
"""
diff = difflib.ndiff(text1.splitlines(), text2.splitlines())
print("\n".join(diff))
# Вывод:
# This is the first line.
# - This is the second line.
# + This is the modified second line.
# ? +++++++++
#
# - This is the third line.
# ? ---
#
# + This is the fourth line.
# ? ++++
# ^
# Более наглядное сравнение:
diff = difflib.unified_diff(text1.splitlines(), text2.splitlines(), fromfile='file1.txt', tofile='file2.txt')
print("\n".join(diff))
# Вывод:
# --- file1.txt
# +++ file2.txt
# @@ -1,4 +1,4 @@
#
# This is the first line.
# -This is the second line.
# +This is the modified second line.
# -This is the third line.
# +This is the fourth line.
# Сравнение HTML:
from difflib import HtmlDiff
html_diff = HtmlDiff()
table = html_diff.make_table(text1.splitlines(), text2.splitlines(), fromdesc='file1.txt', todesc='file2.txt')
with open('diff.html', 'w') as f:
f.write(table) # Сохранение результата в HTML файл
⬆️ В этом примере демонстрируется использование функций ndiff и unified_diff для сравнения двух строк построчно. ndiff показывает различия с помощью специальных символов: - для удаленных строк, + для добавленных и ? для изменений внутри строки. unified_diff предоставляет более компактный вывод, похожий на формат патчей. Также показан пример использования HtmlDiff для создания HTML-таблицы с различиями, что удобно для визуального сравнения.
🐍 Pythoner6 622
Миграция в облако? Это легко!
Собственная инфраструктура устарела или не справляется с нагрузками? Используйте облачные ресурсы! Эксперты Yandex Cloud помогут перейти в облако быстро, легко и безопасно.
✅ Мы полностью сопровождаем процесс.
✅ От вас — только инженер с доступом к инфраструктуре.
✅ Архитектура под ваши задачи, миграция и поддержка на каждом шагу — всё включено.
⚡Переходите в Yandex Cloud и забудьте о старом железе. А если успеете подать заявку до 31 декабря, мы покроем расходы на инженеров и тестовую инфраструктуру.
Подать заявку
#реклама 16+
yandex.cloud
О рекламодателе
Реклама на Яндексе
6 622
✈️ В Python FastAPI — это современный, высокопроизводительный веб-фреймворк для создания API. Он основан на стандартах OpenAPI и JSON Schema, что обеспечивает автоматическую генерацию интерактивной документации и валидацию данных. FastAPI использует асинхронный подход (ASGI), что делает его одним из самых быстрых Python фреймворков.
➡️ Применение FastAPI идеально подходит для разработки API, микросервисов, backend-систем и других веб-приложений, где требуется высокая производительность, простота разработки и надежная валидация данных. Автоматическая генерация документации существенно упрощает взаимодействие с API.
➡️ Вот пример простого приложения FastAPI:
from fastapi import FastAPI, Query, Path, HTTPException
from pydantic import BaseModel
from typing import List, Optional
app = FastAPI(title="My Awesome API", version="1.0.0", description="Example FastAPI application")
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
@app.get("/") # GET-запрос на корневой путь
async def root():
return {"message": "Hello World"}
@app.get("/items/{item_id}") # GET-запрос с параметром пути
async def read_item(item_id: int = Path(..., title="The ID of the item to get", ge=1)): # Валидация параметра пути
return {"item_id": item_id}
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, min_length=3, max_length=50)): # Валидация query-параметра
results = {"items": [{"item_id": "foo"}, {"item_id": "bar"}]}
if q:
results.update({"q": q})
return results
@app.post("/items/", response_model=Item) # POST-запрос с валидацией тела запроса
async def create_item(item: Item):
return item
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
return {"item_id": item_id, **item.dict()}
@app.get("/users/{user_id}")
async def get_user(user_id: int):
# Пример обработки ошибок
if user_id == 404:
raise HTTPException(status_code=404, detail="User not found")
return {"user_id": user_id}
# Запуск приложения
uvicorn main:app --reload
⬆️ В этом примере демонстрируется создание приложения FastAPI, определение GET и POST маршрутов, использование параметров пути и запроса с валидацией, работа с Pydantic моделями для валидации тела запроса и обработка ошибок с помощью HTTPException. Для запуска приложения используйте команду uvicorn main:app --reload, где main — имя файла, а app — имя экземпляра FastAPI. После запуска перейдите по адресу /docs в браузере, чтобы увидеть автоматически сгенерированную интерактивную документацию.
🐍 Pythoner6 622
✈️ В Python dataclasses — это модуль, предоставляющий декоратор
@dataclass, который автоматически генерирует шаблонный код для классов, преимущественно предназначенных для хранения данных. Это упрощает создание классов с атрибутами, методами __init__, __repr__, __eq__ и другими, без необходимости писать их вручную.
➡️ Применение dataclasses позволяет сократить объем кода, улучшить его читаемость и уменьшить вероятность ошибок, связанных с ручным написанием шаблонного кода. Они особенно полезны для создания классов, представляющих структуры данных или объекты с простым набором атрибутов.
➡️ Вот пример использования dataclasses:
from dataclasses import dataclass, field
@dataclass(order=True) # order=True добавляет методы сравнения
class Person:
name: str
age: int
city: str = "Unknown" # Значение по умолчанию
email: str = field(default="no_email@example.com", repr=False) # repr=False скрывает поле в __repr__
scores: list[int] = field(default_factory=list) # mutable default value
person1 = Person("Alice", 30, "New York", scores=[100, 90])
person2 = Person("Bob", 25, "Los Angeles")
person3 = Person("Charlie", 35, scores=[80, 85])
person4 = Person("Alice", 30, "New York", scores=[100, 90])
print(person1) # Вывод: Person(name='Alice', age=30, city='New York', scores=[100, 90])
print(person2) # Вывод: Person(name='Bob', age=25, city='Los Angeles', scores=[])
print(person3) # Вывод: Person(name='Charlie', age=35, city='Unknown', scores=[80, 85])
print(person1 == person4) # True
print(person1 > person2) # True (сравнение по name, затем age)
# Изменение атрибутов:
person1.city = "San Francisco"
person1.scores.append(95)
print(person1) # Вывод: Person(name='Alice', age=30, city='San Francisco', scores=[100, 90, 95])
# Post-init processing
@dataclass
class InventoryItem:
"""Class for keeping track of an item in inventory."""
name: str
unit_price: float
quantity_on_hand: int = 0
def __post_init__(self):
self.total_cost = self.unit_price * self.quantity_on_hand
item = InventoryItem("Pen", 1.5, 50)
print(item.total_cost) # 75.0
⬆️ В этом примере показано создание dataclass Person с различными типами полей, включая значение по умолчанию, field для скрытия поля в __repr__ и default_factory для изменяемых значений по умолчанию. Демонстрируется вывод информации о dataclass с помощью print, сравнение объектов dataclass и изменение атрибутов. Также приведен пример использования __post_init__ для выполнения действий после инициализации dataclass, как, например, вычисление total_cost в InventoryItem. order=True позволяет сравнивать экземпляры dataclass.
🐍Pythoner6 622
✈️ В Python си-коллбеки (C callbacks) — это механизм, позволяющий вызывать функции, написанные на языке C или C++, из Python кода. Это мощный инструмент для интеграции Python с существующими библиотеками C/C++ или для оптимизации производительности критически важных участков кода.
➡️ Применение си-коллбеков находит применение в различных областях, таких как:
* Интеграция с C/C++ библиотеками: вызов функций из библиотек, написанных на C/C++, непосредственно из Python.
* Оптимизация производительности: реализация критичных к производительности участков кода на C/C++ и вызов их из Python.
* Обработка событий: использование функций Python в качестве обработчиков событий в C/C++ приложениях.
* Расширение функциональности Python: добавление новых возможностей в Python с помощью C/C++.
➡️ Вот пример использования си-коллбеков с ctypes:
import ctypes
import time
# Загрузка библиотеки C (libcallback_example.so - пример, нужно скомпилировать код C)
lib = ctypes.CDLL("./libcallback_example.so")
# Определение типа функции обратного вызова
CMPFUNC = ctypes.CFUNCTYPE(None, ctypes.c_int)
# Функция Python, которая будет использоваться в качестве обратного вызова
def my_callback(value):
print(f"Python callback called with value: {value}")
# Регистрация функции обратного вызова в библиотеке C
# Предполагается, что в библиотеке C есть функция register_callback, принимающая указатель на функцию
register_callback = lib.register_callback
register_callback.argtypes = [CMPFUNC]
register_callback.restype = None
register_callback(CMPFUNC(my_callback))
# Вызов функции C, которая будет периодически вызывать функцию обратного вызова
# Предполагается, что в библиотеке C есть функция run_loop, которая запускает цикл
run_loop = lib.run_loop
run_loop.argtypes = []
run_loop.restype = None
run_loop()
Пример кода на C (callback_example.c):
#include <stdio.h>
#include <unistd.h> // for sleep
typedef void (*callback_function)(int);
static callback_function registered_callback = NULL;
void register_callback(callback_function callback) {
registered_callback = callback;
}
void run_loop() {
int i = 0;
while (i < 5) {
sleep(1);
if (registered_callback != NULL) {
registered_callback(i);
}
i++;
}
}
Компиляция кода на C:
gcc -shared -o libcallback_example.so -fPIC callback_example.c
⬆️ В этом примере показано, как использовать ctypes для вызова функций из динамически подключаемой библиотеки C и передачи функции Python в качестве обратного вызова. Код на C регистрирует коллбек и периодически вызывает его. Важно правильно определить типы данных с помощью ctypes.CFUNCTYPE и argtypes/restype. Перед запуском Python кода необходимо скомпилировать код C в shared library (.so файл для Linux).
🐍 Pythoner6 622
✈️ В Python BeautifulSoup4 (bs4) — это мощная библиотека для парсинга HTML и XML документов. Она предоставляет удобный интерфейс для навигации, поиска и модификации элементов в древовидной структуре документа. BeautifulSoup4 автоматически обрабатывает некорректный HTML, что делает её незаменимой для работы с реальными веб-страницами.
➡️ Применение BeautifulSoup4 широко распространено в веб-скрапинге, извлечении данных, анализе веб-контента и автоматизации задач, связанных с обработкой HTML и XML. Библиотека позволяет легко извлекать текст, ссылки, атрибуты и другие данные из веб-страниц.
➡️ Вот пример использования BeautifulSoup4 для парсинга HTML:
from bs4 import BeautifulSoup
html_content = """
<!DOCTYPE html>
<html lang="en">
<head>
<title>Example Page</title>
<meta name="description" content="Example description">
</head>
<body>
<h1>This is a heading</h1>
<p>This is some text in a paragraph.</p>
<a href="https://www.example.com">This is a link</a>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
<div class="my-class">This is a div</div>
<p id="my-id">This is a paragraph with id </p>
</body>
</html>
"""
soup = BeautifulSoup(html_content, "html.parser") # "html.parser" - используемый парсер
# Навигация и поиск элементов:
title = soup.title.string # Получение текста заголовка
print("Title:", title)
description = soup.find("meta", attrs={"name": "description"})["content"]
print("Description:", description)
links = soup.find_all("a")
for link in links:
print("Link:", link["href"])
paragraphs = soup.find_all("p")
for p in paragraphs:
print("Paragraph:", p.text)
list_items = soup.find("ul").find_all("li")
for item in list_items:
print("List item:", item.text)
div_with_class = soup.find("div", class_="my-class")
print("Div with class:", div_with_class.text)
paragraph_with_id = soup.find("p", id="my-id")
print("Paragraph with id:", paragraph_with_id.text)
# Модификация HTML:
new_paragraph = soup.new_tag("p")
new_paragraph.string = "This is a new paragraph."
soup.body.append(new_paragraph)
print(soup.prettify()) # Вывод измененного HTML с отступами
⬆️ В этом примере демонстрируется создание объекта BeautifulSoup из HTML-строки, получение заголовка, поиск элементов по тегам, атрибутам и классам, извлечение текста и атрибутов элементов, а также добавление нового элемента в HTML-структуру. Используется парсер "html.parser", который встроен в Python. Для более сложных случаев можно использовать другие парсеры, такие как lxml или html5lib. Вывод soup.prettify() позволяет увидеть форматированный HTML-код после внесенных изменений.
🐍 Pythoner6 622
🐍Разбор
Что возвращает метод строки find()?
Самый быстрый способ это узнать — заглянуть в документацию Python. Согласно официальной документации, если подстрока не найдена, метод `find()` возвращает -1.
Теперь интересный момент: что произойдет, если преобразовать `-1` в логическое значение? Давайте проверим:
print(bool(-1)) # Результат: True
Как видите, -1 в Python считается истинным значением (True) при приведении к типу bool.6 622
✈️ В Python Black — это мощный инструмент форматирования кода, известный своей бескомпромиссностью и скоростью. Black автоматически переформатирует ваш код Python в соответствии со строгим набором правил, устраняя споры о стиле кода и обеспечивая единообразное форматирование во всей кодовой базе.
➡️ Применение Black значительно упрощает командную работу над проектами, поскольку разработчикам больше не нужно тратить время на ручное форматирование кода и обсуждение стилистических предпочтений. Black также улучшает читаемость кода, делая его более понятным и удобным для восприятия. Автоматическое форматирование экономит время и позволяет сосредоточиться на логике кода, а не на его внешнем виде.
➡️ Вот пример использования Black:
# неформатированный код
def very_important_function(template: str, *variables, engine: str = "jinja2"):
"""Applies `variables` to the `template` using the `engine`."""
if engine == "jinja2":
return template.render(*variables)
elif engine == 'f-strings':
return eval(f"f'{template}'")
return template.format(*variables)
# установка black: pip install black
# запуск black: black имя_файла.py
# отформатированный код после Black
def very_important_function(
template: str, *variables, engine: str = "jinja2"
):
"""Applies `variables` to the `template` using the `engine`."""
if engine == "jinja2":
return template.render(*variables)
elif engine == "f-strings":
return eval(f"f'{template}'")
return template.format(*variables)
⬆️В этом примере показан фрагмент кода до и после форматирования Black. Black автоматически изменил отступы, переводы строк и расположение скобок, приведя код к единому стилю. Обратите внимание, что Black не изменяет логику кода, а только его форматирование. Для использования Black необходимо установить его с помощью pip install black и запустить из командной строки, указав имя файла или директории, которую нужно отформатировать: black имя_файла.py или black . для форматирования всех файлов в текущей директории.
🐍 Pythoner6 622
Школьник + бесплатные курсы по ИТ = новые возможности
Хотите прокачать мышление, научиться решать задачи по математике и информатике и познакомиться с ИТ? Бесплатные курсы для школьников в этом помогут. Занятия включают теорию и практические задачи, а само обучение не будет отнимать много времени - нужно 2-3 часа в неделю. После успешного прохождения одного из курсов вам выдадут сертификат - им можно пополнить портфолио.
Чтобы начать учиться, выберите подходящую программу и оставьте заявку на сайте Т-Образования.
Подать заявку
#реклама 16+
education.tbank.ru
О рекламодателе
6 622
✈️ В Python asyncpg — это высокопроизводительная библиотека для асинхронного доступа к базам данных PostgreSQL. Она построена на базе asyncio и предоставляет низкоуровневый интерфейс для взаимодействия с PostgreSQL, обеспечивая высокую скорость и эффективность.
➡️ Применение asyncpg особенно актуально в высоконагруженных веб-приложениях и сервисах, где требуется максимальная производительность при работе с базой данных. asyncpg позволяет выполнять запросы к базе данных асинхронно, не блокируя основной поток приложения, что повышает общую отзывчивость и пропускную способность. Библиотека также поддерживает продвинутые возможности PostgreSQL, такие как JSON, hstore и уведомления.
➡️ Вот пример использования asyncpg для выполнения запросов к базе данных:
import asyncio
import asyncpg
async def run():
conn = await asyncpg.connect(user="user", password="password", database="database", host="127.0.0.1") # Подставьте свои учетные данные
try:
# Выполнение запроса на создание таблицы (если она не существует)
await conn.execute('''
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name TEXT
)
''')
# Выполнение запроса на вставку данных
await conn.execute("INSERT INTO users (name) VALUES ($1)", "Alice")
# Выполнение запроса на выборку данных
result = await conn.fetch("SELECT * FROM users")
print(result) # Вывод: [<Record id=1 name='Alice'>]
# Выполнение параметризованного запроса на выборку данных
user_name = "Alice"
user = await conn.fetchrow("SELECT * FROM users WHERE name = $1", user_name)
print(user) # Вывод: <Record id=1 name='Alice'>
# Транзакции
async with conn.transaction():
await conn.execute("UPDATE users SET name = $1 WHERE id = $2", "Bob", 1)
# Обработка ошибок
try:
await conn.execute("SELECT * FROM non_existent_table") # Несуществующая таблица
except asyncpg.exceptions.UndefinedTableError as e:
print(f"Ошибка: {e}")
finally:
await conn.close()
if __name__ == "__main__":
asyncio.run(run())
⬆️ В этом примере демонстрируется подключение к базе данных PostgreSQL, выполнение различных SQL-запросов (создание таблицы, вставка, выборка данных), использование параметризованных запросов, обработка транзакций и пример обработки исключения UndefinedTableError. Для запуска примера необходимо установить asyncpg (pip install asyncpg) и иметь работающий сервер PostgreSQL с указанными учетными данными. Не забудьте заменить user, password, database, и host на ваши реальные данные. Помните, что asyncpg работает асинхронно, поэтому необходимо использовать asyncio.run() для запуска кода.
🐍 Pythoner6 622
Крупнейший университет искусственного интеллекта
Учим использовать ChatGPT в профессиональных целях, создавать нейро-сотрудников и зарабатывать на искусственном интеллекте.
✨ 8 000+ студентов со всего мира
✨ 600+ AI-проектов, созданных студентами
✨ Сборная Университета — победители крупнейших AI-хакатонов России
✨ Стажировки в крупнейших компаниях России (РЖД, Ростелеком, РУДН, Совкомбанк, Самолет и другие)
✨ Трудоустраиваем выпускников в крупнейшие компании (Яндекс, ВТБ, Сбербанк, Роскосмос и другие)
Будем рады видеть тебя в наших рядах!
Узнать больше
#реклама 16+
neural-university.ru
О рекламодателе
6 622
✈️ В Python trafilatura — это мощная библиотека для извлечения основного текста из веб-страниц. Она эффективно обрабатывает HTML, XML и другие форматы, удаляя ненужные элементы, такие как навигация, реклама и боковые панели, оставляя только основной контент статьи или публикации.
➡️ Применение trafilatura широко распространено в веб-скрапинге, анализе текста, создании датасетов для машинного обучения и других задачах, где требуется чистый текст из веб-источников. Библиотека предоставляет гибкие настройки для обработки различных типов веб-страниц и поддерживает извлечение метаданных, таких как заголовок, автор и дата публикации.
➡️ Вот пример использования trafilatura для извлечения текста из веб-страницы:
from trafilatura import extract
downloaded_html = """
<!DOCTYPE html>
<html lang="en">
<head>
<title>Example Page</title>
</head>
<body>
<h1>This is a heading</h1>
<p>This is some text in a paragraph.</p>
<aside>This is some text in a sidebar.</aside>
<p>This is more text in another paragraph.</p>
<footer>This is a footer.</footer>
</body>
</html>
"""
extracted_text = extract(downloaded_html)
print(extracted_text)
# Вывод:
# This is a heading
# This is some text in a paragraph.
# This is more text in another paragraph.
from trafilatura import fetch_url
url = "https://www.example.com" # Замените на реальный URL
try:
extracted_text = fetch_url(url)
if extracted_text:
print(extracted_text)
else:
print("Не удалось извлечь текст с URL")
except Exception as e:
print(f"Произошла ошибка: {e}")
from trafilatura import bare_extraction
extracted_text_with_metadata = bare_extraction(downloaded_html, include_comments=False, include_tables=True, deduplicate=True)
print(extracted_text_with_metadata)
# Пример вывода (может варьироваться в зависимости от контента страницы):
# {'title': 'Example Page', 'text': 'This is a heading\nThis is some text in a paragraph.\nThis is more text in another paragraph.', 'author': None, 'url': None, 'hostname': None, 'description': None, 'date': None}
⬆️ В этом примере демонстрируется использование функций extract и fetch_url из библиотеки trafilatura. Функция extract извлекает текст из предоставленного HTML-кода, а fetch_url загружает и обрабатывает веб-страницу по указанному URL. Также приведен пример использования bare_extraction для получения текста вместе с метаданными. Обратите внимание, что для работы с fetch_url требуется активное интернет-соединение и корректный URL. Пример с bare_extraction показывает, как получить дополнительные данные, такие как заголовок страницы.
🐍 Pythoner6 622
✈️ В Python абстрактные классы (ABC) — это классы, которые предназначены для того, чтобы быть базовыми для других классов, и не предполагают создания собственных экземпляров. Абстрактные классы позволяют определить общий интерфейс для группы подклассов, обеспечивая, что все они реализуют определенные методы.
➡️ Применение абстрактных классов способствует созданию более структурированного и поддерживаемого кода, повышает его читаемость и позволяет применять полиморфизм более эффективно. Они особенно полезны при разработке библиотек и фреймворков, где необходимо обеспечить определенный набор функциональности в классах-наследниках. Использование ABC помогает предотвратить ошибки, связанные с отсутствием реализации обязательных методов в подклассах, которые могли бы проявиться только во время выполнения.
➡️ Вот пример абстрактного класса и его использования:
from abc import ABC, abstractmethod
class Animal(ABC): # Animal - абстрактный базовый класс
@abstractmethod
def make_sound(self):
pass
@abstractmethod
def move(self):
pass
class Dog(Animal):
def make_sound(self):
return "Woof!"
def move(self):
return "Runs"
class Cat(Animal):
def make_sound(self):
return "Meow!"
def move(self):
return "Walks"
dog = Dog()
print(dog.make_sound()) # Вывод: Woof!
print(dog.move()) # Вывод: Runs
cat = Cat()
print(cat.make_sound()) # Вывод: Meow!
print(cat.move()) # Вывод: Walks
try:
animal = Animal() # Попытка создать экземпляр абстрактного класса
except TypeError as e:
print(e) # Вывод: Can't instantiate abstract class Animal with abstract methods make_sound, move
animals = [Dog(), Cat()]
for animal in animals:
print(animal.make_sound()) # Полиморфизм: вызов метода make_sound для разных животных
class Fish(Animal):
def make_sound(self):
return "Blub!"
# Забыли реализовать метод move
try:
fish = Fish() # Попытка создать экземпляр класса с нереализованным абстрактным методом
except TypeError as e:
print(e) # Вывод: Can't instantiate abstract class Fish with abstract methods move
⬆️ В этом примере создается абстрактный класс Animal с абстрактными методами make_sound и move. Классы Dog и Cat наследуют от Animal и реализуют эти методы. Попытка создать экземпляр самого абстрактного класса Animal приводит к ошибке TypeError. Демонстрируется полиморфизм: один и тот же код animal.make_sound() работает с объектами разных классов, производных от Animal, и выдает специфичный для каждого класса результат. Также показан пример ошибки, возникающей при попытке создания экземпляра класса Fish, который не реализует все абстрактные методы базового класса.
🐍 Pythoner6 622
Хочешь узнать все самые интересные фишки в DevOps?
Подписывайся на Telegram-канал DevOps Bootcamp от учебного центра Слёрм и забирай подарок!
Для тех, кто собирается в DevOps ы разработали свой Roadmap на основе опыта спикеров Слёрма. Он сделан с учётом российских реалий, разбит на уровни, фокусирует внимание на том, что в первую очередь понвдобится для старта и роста в профессии, и содержит ссылки на дополнительные источники.
Подписаться
#реклама 16+
slurm.io
О рекламодателе
6 622
✈️ В Python
httpx — это современная HTTP-клиентская библиотека, которая предоставляет полный набор функций для работы с HTTP/1.1 и HTTP/2. httpx позволяют разработчикам легко и эффективно взаимодействовать с веб-серверами, отправляя запросы и получая ответы.
➡️ Применение httpx.
httpx широко используется в различных сценариях, включая:
- Веб-скрейпинг: Извлечение данных с веб-страниц.
- API-интеграции: Взаимодействие с RESTful API.
- Тестирование: Автоматизация тестирования веб-сервисов.
- Микросервисы: Обмен данными между микросервисами.
➡️ Вот пример использования httpx:
import httpx
# Отправка GET-запроса
response = httpx.get("https://api.github.com")
# Проверка статуса ответа
if response.status_code == 200:
print("Успешный запрос!")
print("Содержимое ответа:", response.text)
else:
print("Ошибка:", response.status_code)
# Отправка POST-запроса
data = {"key1": "value1", "key2": "value2"}
response = httpx.post("https://httpbin.org/post", data=data)
# Проверка статуса ответа
if response.status_code == 200:
print("Успешный POST-запрос!")
print("Содержимое ответа:", response.json())
else:
print("Ошибка:", response.status_code)
⬆️ В этом примере создается HTTP-клиент с использованием httpx, который отправляет GET и POST запросы на указанные URL.
🐍 Pythoner