KIMOSSINO commited on
Commit
472c950
·
verified ·
1 Parent(s): c7569af

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -93
app.py CHANGED
@@ -1,114 +1,76 @@
1
  import gradio as gr
2
- import pandas as pd
3
  from bs4 import BeautifulSoup
4
  from collections import Counter
5
- from io import BytesIO
6
 
7
- # دالة لتحليل البيانات واستخراج العناوين والهاشتاغات
8
- def analyze_tiktok_data(file, min_frequency):
 
 
 
 
9
  try:
10
- # قراءة محتوى الملف
11
- content = file.read().decode('utf-8') if isinstance(file.read(), bytes) else file.read()
12
-
13
- # تحليل HTML باستخدام BeautifulSoup
14
- soup = BeautifulSoup(content, 'html.parser')
15
- desc_containers = soup.find_all('div', class_=lambda x: x and 'DivDesContainer' in x)
16
-
17
- if not desc_containers:
18
- return "لم يتم العثور على بيانات متطابقة", None
19
-
20
- # استخراج البيانات
21
- data = []
22
- hashtags_counter = Counter()
23
-
24
- for container in desc_containers[:500]:
25
- title = container.get('aria-label', 'بدون عنوان')
26
- hashtags = [
27
- tag.get_text(strip=True) for tag in container.find_all(['a', 'span'])
28
- if tag.get_text(strip=True).startswith('#')
29
- ]
30
- hashtags_counter.update(hashtags)
31
- data.append({"العنوان": title, "الهاشتاغات": ", ".join(hashtags)})
32
-
33
- # إنشاء DataFrame للعناوين والهاشتاغات
34
- df_titles = pd.DataFrame(data)
35
-
36
- # تصفية الهاشتاغات حسب التكرار
37
- df_hashtags = pd.DataFrame(
38
- [(tag, count) for tag, count in hashtags_counter.items() if count >= min_frequency],
39
- columns=["الهاشتاغ", "عدد التكرار"]
40
- ).sort_values(by="عدد التكرار", ascending=False)
41
-
42
- return df_titles, df_hashtags
43
 
44
  except Exception as e:
45
- return f"حدث خطأ أثناء التحليل: {str(e)}", None
 
46
 
47
  # إنشاء واجهة Gradio
48
  def gradio_interface():
49
- with gr.Blocks(css="""
50
- .container {
51
- max-width: 800px;
52
- margin: auto;
53
- padding: 20px;
54
- }
55
- .btn-primary {
56
- background-color: #4CAF50;
57
- color: white;
58
- }
59
- .table {
60
- width: 100%;
61
- border-collapse: collapse;
62
- margin-bottom: 20px;
63
- }
64
- .table th, .table td {
65
- border: 1px solid #ddd;
66
- padding: 8px;
67
- }
68
- .table th {
69
- background-color: #f2f2f2;
70
- text-align: left;
71
- }
72
- """) as demo:
73
- gr.Markdown("## مستخرج الهاشتاغات والعناوين من TikTok 🏷️", elem_classes=["container"])
74
-
75
- with gr.Row(elem_classes=["container"]):
76
- file_input = gr.File(label="ارفع ملف HTML")
77
  min_freq_slider = gr.Slider(
78
- minimum=1, maximum=50, value=1, label="الحد الأدنى لتكرار الهاشتاغ"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  )
80
 
81
- analyze_btn = gr.Button("تحليل البيانات", elem_classes=["btn-primary"])
82
-
83
- with gr.Tabs(elem_classes=["container"]):
84
- with gr.TabItem("العناوين"):
85
- titles_output = gr.HTML(label="العناوين")
86
-
87
- with gr.TabItem("الهاشتاغات"):
88
- hashtags_output = gr.HTML(label="الهاشتاغات")
89
- with gr.Row():
90
- copy_btn = gr.Button("نسخ الهاشتاغات", elem_classes=["btn-primary"])
91
- hashtags_textbox = gr.Textbox(
92
- label="نسخ الهاشتاغات هنا", visible=False, interactive=False
93
- )
94
-
95
- # عند الضغط على زر التحليل
96
  analyze_btn.click(
97
- fn=analyze_tiktok_data,
98
  inputs=[file_input, min_freq_slider],
99
  outputs=[titles_output, hashtags_output],
100
  )
101
-
102
- # نسخ الهاشتاغات إلى مربع النص
103
- copy_btn.click(
104
- fn=lambda df_titles, df_hashtags: "\n".join(df_hashtags["الهاشتاغ"].tolist()) if df_hashtags is not None else "",
105
- inputs=[file_input, min_freq_slider],
106
- outputs=hashtags_textbox,
107
- )
108
- hashtags_textbox.change(visible=True)
109
 
110
  return demo
111
 
 
112
  # تشغيل التطبيق
113
- demo = gradio_interface()
114
- demo.launch()
 
 
1
  import gradio as gr
 
2
  from bs4 import BeautifulSoup
3
  from collections import Counter
4
+ import re
5
 
6
+ # دالة استخراج العناوين والهاشتاغات من ملف HTML
7
+ def extract_titles_and_hashtags(file, min_frequency=1):
8
+ if not file:
9
+ return "❌ لم يتم رفع ملف", "❌ لم يتم رفع ملف"
10
+
11
+ # قراءة محتوى الملف
12
  try:
13
+ content = file.read()
14
+ soup = BeautifulSoup(content, "html.parser")
15
+
16
+ # استخراج العناوين من عناصر HTML
17
+ titles = [title.get_text() for title in soup.find_all("title")]
18
+ titles_output = "\n".join(titles) if titles else "❌ لم يتم العثور على عناوين"
19
+
20
+ # استخراج النصوص المحتوية على هاشتاغات
21
+ text = soup.get_text()
22
+ hashtags = re.findall(r"#\w+", text)
23
+
24
+ # حساب تكرار الهاشتاغات وتصفيتها بناءً على التكرار
25
+ hashtags_counter = Counter(hashtags)
26
+ filtered_hashtags = [
27
+ f"{tag}: {count}" for tag, count in hashtags_counter.items() if count >= min_frequency
28
+ ]
29
+ hashtags_output = "\n".join(filtered_hashtags) if filtered_hashtags else "❌ لا توجد هاشتاغات متكررة"
30
+
31
+ return titles_output, hashtags_output
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
  except Exception as e:
34
+ return f" خطأ أثناء معالجة الملف: {str(e)}", "❌ خطأ أثناء معالجة الملف"
35
+
36
 
37
  # إنشاء واجهة Gradio
38
  def gradio_interface():
39
+ with gr.Blocks() as demo:
40
+ gr.Markdown("## 🏷️ محلل العناوين والهاشتاغات المتقدم")
41
+
42
+ with gr.Row():
43
+ file_input = gr.File(label="📂 رفع ملف HTML", file_types=[".html"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  min_freq_slider = gr.Slider(
45
+ minimum=1, maximum=50, value=1, step=1,
46
+ label="📊 الحد الأدنى لتكرار الهاشتاغ"
47
+ )
48
+
49
+ with gr.Row():
50
+ analyze_btn = gr.Button("تحليل البيانات", variant="primary")
51
+
52
+ with gr.Row():
53
+ titles_output = gr.Textbox(
54
+ label="📜 العناوين المستخرجة",
55
+ lines=10,
56
+ interactive=False
57
+ )
58
+ hashtags_output = gr.Textbox(
59
+ label="🏷️ الهاشتاغات المستخرجة",
60
+ lines=10,
61
+ interactive=False
62
  )
63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  analyze_btn.click(
65
+ fn=extract_titles_and_hashtags,
66
  inputs=[file_input, min_freq_slider],
67
  outputs=[titles_output, hashtags_output],
68
  )
 
 
 
 
 
 
 
 
69
 
70
  return demo
71
 
72
+
73
  # تشغيل التطبيق
74
+ if __name__ == "__main__":
75
+ demo = gradio_interface()
76
+ demo.launch()