import gradio as gr import pandas as pd import requests import os from datetime import datetime from docx import Document def search_api(query): url = f"https://api.duckduckgo.com/?q={query}&format=json&no_redirect=1" response = requests.get(url) if response.status_code == 200: data = response.json() related_topics = data.get("RelatedTopics", []) results = [] for topic in related_topics: if "Text" in topic and "FirstURL" in topic: results.append({ "Title": topic["Text"], "URL": topic["FirstURL"] }) return pd.DataFrame(results) else: return pd.DataFrame([{"Title": "Error", "URL": "Failed to fetch results"}]) # Save results def export_csv(df): file_path = "search_results.csv" df.to_csv(file_path, index=False) return file_path def export_docx(df): doc = Document() doc.add_heading("Search Results", 0) for _, row in df.iterrows(): doc.add_paragraph(f"{row['Title']}\n{row['URL']}") file_path = "search_results.docx" doc.save(file_path) return file_path # Set up Gradio Blocks with gr.Blocks() as demo: gr.Markdown("## 🔎 Simple Search with Export Options") query_input = gr.Textbox(label="Search Query", placeholder="Enter a topic...") search_button = gr.Button("Search") results_df = gr.Dataframe(label="Search Results", interactive=False) with gr.Row(): export_csv_button = gr.Button("Export as CSV") export_docx_button = gr.Button("Export as Word DOCX") csv_output = gr.File(label="Download CSV") docx_output = gr.File(label="Download DOCX") # Logic def handle_search(q): df = search_api(q) return df def handle_csv_export(df): return export_csv(df) def handle_docx_export(df): return export_docx(df) search_button.click(handle_search, inputs=query_input, outputs=results_df) export_csv_button.click(handle_csv_export, inputs=results_df, outputs=csv_output) export_docx_button.click(handle_docx_export, inputs=results_df, outputs=docx_output) demo.launch()