File size: 4,971 Bytes
614c7a3
aff42bd
614c7a3
 
 
 
aff42bd
 
614c7a3
 
 
 
 
 
 
 
aff42bd
 
 
 
 
 
 
614c7a3
aff42bd
614c7a3
 
 
 
aff42bd
614c7a3
 
 
 
 
aff42bd
 
614c7a3
 
 
 
 
 
 
 
aff42bd
 
614c7a3
aff42bd
614c7a3
 
 
 
 
aff42bd
 
614c7a3
 
 
 
 
 
 
 
 
 
 
aff42bd
614c7a3
aff42bd
 
 
614c7a3
 
 
 
 
 
 
 
aff42bd
 
614c7a3
aff42bd
614c7a3
aff42bd
 
 
 
614c7a3
aff42bd
 
614c7a3
 
 
aff42bd
 
614c7a3
 
 
aff42bd
 
 
 
614c7a3
 
 
 
 
aff42bd
 
614c7a3
 
 
 
aff42bd
 
 
 
 
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
117
118
119
120
# Gerekli kütüphaneleri içe aktarıyoruz.
# Bu kütüphaneleri kurmak için: pip install gradio requests beautifulsoup4
import gradio as gr
import requests
from bs4 import BeautifulSoup

# --- Çekirdek Mantık (Önceki Script'ten Uyarlanmış) ---

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'
}

def scrape_wikipedia_article(url: str):
    """
    Kullanıcının girdiği URL'den Wikipedia makalesini çeker ve işler.
    Bu fonksiyon, Gradio arayüzünün "beyni" olarak çalışacaktır.

    Args:
        url (str): Kullanıcının Gradio arayüzünden girdiği Wikipedia URL'si.

    Returns:
        tuple: (Başlık, Paragraf Sayısı, Paragrafların Markdown Formatı)
               veya hata durumunda (Hata Mesajı, 0, "")
    """
    # URL'nin geçerli bir Wikipedia adresi olup olmadığını basitçe kontrol edelim.
    if not url or "wikipedia.org" not in url:
        return "Lütfen geçerli bir Wikipedia URL'si girin.", 0, ""

    try:
        # --- Veri Çekme (Scraping) ---
        response = requests.get(url, headers=HEADERS, timeout=10)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.content, "html.parser")
        
        # --- Veri Ayrıştırma (Parsing) ---
        # Sayfa başlığını <h1 id="firstHeading"> etiketinden alalım.
        page_title_element = soup.find('h1', id='firstHeading')
        page_title = page_title_element.text if page_title_element else "Başlık Bulunamadı"

        content_div = soup.find('div', class_='mw-parser-output')
        if not content_div:
            return f"'{page_title}' sayfasında ana içerik alanı bulunamadı.", 0, ""

        paragraphs_html = content_div.find_all('p')
        
        # --- Veri Temizleme ve Formatlama ---
        cleaned_paragraphs = [p.get_text(strip=True) for p in paragraphs_html if len(p.get_text(strip=True)) > 50]
        
        paragraph_count = len(cleaned_paragraphs)
        
        if paragraph_count == 0:
            return f"'{page_title}' sayfasında yeterli uzunlukta paragraf bulunamadı.", 0, ""
            
        # Çıktıyı daha okunaklı hale getirmek için Markdown formatını kullanalım.
        # Her paragrafı bir liste elemanı olarak formatlayalım.
        markdown_output = "\n".join([f"- {p}\n" for p in cleaned_paragraphs])
        
        return page_title, paragraph_count, markdown_output

    except requests.exceptions.RequestException as e:
        error_message = f"Ağ hatası: URL'ye ulaşılamadı. Lütfen adresi kontrol edin.\nDetay: {e}"
        return "Hata", 0, error_message
    except Exception as e:
        error_message = f"Beklenmedik bir hata oluştu: {e}"
        return "Hata", 0, error_message


# --- Gradio Arayüzü Tanımlaması ---

# Uygulamanın nasıl görüneceğini ve davranacağını tanımlıyoruz.
# with gr.Blocks() as iface: daha gelişmiş arayüzler için kullanılır.
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown(
        """
        # Wikipedia Makale Çekme ve Analiz Aracı
        Aşağıya bir Wikipedia makalesinin URL'sini yapıştırın ve "Analiz Et" butonuna tıklayarak
        sayfadaki paragrafları çekin.
        """
    )
    
    # Girdi ve Çıktı Alanları
    with gr.Row():
        # Sol taraf: Girdiler
        with gr.Column(scale=1):
            url_input = gr.Textbox(
                label="Wikipedia URL'si", 
                placeholder="https://tr.wikipedia.org/wiki/Yapay_zeka"
            )
            submit_btn = gr.Button("Analiz Et", variant="primary")

            # Analiz sonuçları için küçük bilgi kutucukları
            with gr.Row():
                article_title_output = gr.Textbox(label="Makale Başlığı", interactive=False)
                paragraph_count_output = gr.Number(label="Paragraf Sayısı", interactive=False)

        # Sağ taraf: Çıktılar
        with gr.Column(scale=2):
            main_output = gr.Markdown(label="Çekilen Paragraflar")

    # Butona tıklandığında ne olacağını belirliyoruz.
    # fn: Hangi fonksiyon çalışacak? (scrape_wikipedia_article)
    # inputs: Fonksiyona hangi girdi gidecek? (url_input)
    # outputs: Fonksiyondan dönen sonuçlar hangi çıktı alanlarına gidecek?
    submit_btn.click(
        fn=scrape_wikipedia_article, 
        inputs=url_input, 
        outputs=[article_title_output, paragraph_count_output, main_output]
    )
    
    # Kullanıcıların denemesi için örnek URL'ler
    gr.Examples(
        ["https://tr.wikipedia.org/wiki/Kuantum_bilgisayar%C4%B1", "https://tr.wikipedia.org/wiki/Makine_%C3%B6%C4%9Frenmesi"],
        inputs=url_input
    )

# --- Uygulamayı Başlatma ---
# Hugging Face Spaces, bu satırı gördüğünde uygulamayı başlatır ve sunar.
# Bu satır olmadan, script biter ve "application not initialized" hatası alırsınız.
demo.launch()