Spaces:
Sleeping
Sleeping
File size: 5,492 Bytes
80fb263 0eaed2f 80fb263 0eaed2f 80fb263 0eaed2f 80fb263 48bc3a2 80fb263 48bc3a2 66c6476 0eaed2f 48bc3a2 0eaed2f 48bc3a2 3c69552 66c6476 80fb263 66c6476 48bc3a2 66c6476 48bc3a2 3c69552 48bc3a2 66c6476 3c69552 66c6476 48bc3a2 0eaed2f 80fb263 48bc3a2 |
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
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() |