Spaces:
Sleeping
Sleeping
import gradio as gr | |
import requests | |
from urllib.parse import urlparse, urljoin | |
from bs4 import BeautifulSoup | |
def is_valid_url(url): | |
"""Проверяет, является ли строка валидным URL.""" | |
try: | |
result = urlparse(url) | |
return all([result.scheme, result.netloc]) # Проверяем наличие схемы и домена | |
except: | |
return False | |
def extract_additional_resources(url): | |
"""Извлекает ссылки на CSS, JS и изображения из HTML-кода.""" | |
try: | |
response = requests.get(url) | |
response.raise_for_status() | |
soup = BeautifulSoup(response.text, "html.parser") | |
# Извлекаем ссылки на CSS | |
css_links = [urljoin(url, link["href"]) for link in soup.find_all("link", rel="stylesheet") if "href" in link.attrs] | |
# Извлекаем ссылки на JS | |
js_links = [urljoin(url, script["src"]) for script in soup.find_all("script") if "src" in script.attrs] | |
# Извлекаем ссылки на изображения | |
img_links = [urljoin(url, img["src"]) for img in soup.find_all("img") if "src" in img.attrs] | |
return css_links, js_links, img_links | |
except Exception as e: | |
return [], [], [] | |
def convert_to_text(url): | |
if not is_valid_url(url): | |
return "Ошибка: Введите корректный URL.", "", None, [], [], [] # Возвращаем сообщение об ошибке и пустые данные | |
try: | |
# Устанавливаем заголовки, чтобы имитировать запрос от браузера | |
headers = { | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" | |
} | |
response = requests.get(url, headers=headers) | |
response.raise_for_status() # Проверка на ошибки HTTP (например, 404, 500) | |
# Возвращаем результаты | |
status = f"Статус запроса: {response.status_code}" | |
content_length = f"Размер содержимого: {len(response.text)} символов" | |
results = f"{status}\n{content_length}" | |
# Сохраняем текстовое содержимое в файл | |
file_path = "downloaded_content.txt" | |
with open(file_path, "w", encoding="utf-8") as file: | |
file.write(response.text) | |
# Извлекаем дополнительные ресурсы | |
css_links, js_links, img_links = extract_additional_resources(url) | |
return results, response.text, file_path, css_links, js_links, img_links | |
except requests.exceptions.RequestException as e: | |
return f"Ошибка: {e}", "", None, [], [], [] # Возвращаем сообщение об ошибке и пустые данные | |
# HTML и JavaScript для кнопки "Скопировать код" | |
copy_button_html = """ | |
<script> | |
function copyCode() { | |
const text = document.querySelector("#output-text textarea").value; | |
navigator.clipboard.writeText(text).then(() => { | |
alert("Текст скопирован в буфер обмена!"); | |
}).catch(() => { | |
alert("Не удалось скопировать текст."); | |
}); | |
} | |
</script> | |
<button onclick="copyCode()">Скопировать код</button> | |
""" | |
# Подключаем CSS-файл | |
css = "app.css" | |
# Создаем интерфейс Gradio | |
with gr.Blocks(css=css) as demo: | |
gr.Markdown("## Конвертер ссылки в текст") | |
gr.Markdown("Введите ссылку на любой сайт, чтобы получить его текстовое содержимое и скачать его в виде .txt файла.") | |
with gr.Row(): | |
url_input = gr.Textbox(label="Введите URL", placeholder="https://example.com") | |
with gr.Row(): | |
results_output = gr.Textbox(label="Результаты запроса", interactive=False) | |
text_output = gr.Textbox(label="Текстовое содержимое", interactive=True, elem_id="output-text") | |
with gr.Row(): | |
gr.HTML(copy_button_html) # Добавляем кнопку "Скопировать код" | |
file_output = gr.File(label="Скачать файл", visible=False) # Скрытый компонент для скачивания файла | |
submit_button = gr.Button("Загрузить") | |
submit_button.click( | |
fn=convert_to_text, | |
inputs=url_input, | |
outputs=[results_output, text_output, file_output, gr.Textbox(label="CSS-файлы"), gr.Textbox(label="JS-файлы"), gr.Textbox(label="Изображения")] | |
) | |
# Добавляем Accordion для скрытия/показа дополнительных ресурсов | |
with gr.Accordion("Показать/Скрыть дополнительные ресурсы", open=False): | |
gr.Markdown("### CSS-файлы") | |
css_output = gr.Textbox(label="CSS-файлы", interactive=False) | |
gr.Markdown("### JS-файлы") | |
js_output = gr.Textbox(label="JS-файлы", interactive=False) | |
gr.Markdown("### Изображения") | |
img_output = gr.Textbox(label="Изображения", interactive=False) | |
# Запускаем интерфейс | |
demo.launch() |