import gradio as gr import wikipedia import asyncio def search_wikipedia(keyword, max_results=20): try: # Search Wikipedia for articles related to the keyword search_results = wikipedia.search(keyword, results=int(max_results)) if not search_results: return """
No results found for the keyword.
""" # Collect article details output = [] for title in search_results: try: # Get page summary and URL page = wikipedia.page(title, auto_suggest=False) summary = page.summary[:300] + "..." if len(page.summary) > 300 else page.summary output.append({ "Title": title, "Summary": summary, "URL": page.url }) except wikipedia.exceptions.DisambiguationError as e: output.append({ "Title": title, "Summary": f"Disambiguation page. Possible options: {', '.join(e.options[:3])}...", "URL": "N/A" }) except wikipedia.exceptions.PageError: output.append({ "Title": title, "Summary": "Page not found or invalid.", "URL": "N/A" }) # Generate HTML with Tailwind-styled cards html_output = """
""" for item in output: url_link = f'Read on Wikipedia' if item["URL"] != "N/A" else "No link available" html_output += f"""

{item["Title"]}

{item["Summary"]}

{url_link}
""" html_output += "
" return html_output except Exception as e: return """
An error occurred: {str(e)}
""" # Define Gradio interface def gradio_app(): iface = gr.Interface( fn=search_wikipedia, inputs=[ gr.Textbox(label="Enter Keyword (e.g., African History)", placeholder="Type your keyword here"), gr.Slider(label="Max Results", minimum=1, maximum=10, value=5, step=1) ], outputs=gr.HTML(label="Wikipedia Search Results"), title="Wikipedia Article Search", description="Enter a keyword to search for related Wikipedia articles, displayed as stylish cards with titles, summaries, and URLs." ) return iface # Launch the app (for Pyodide compatibility) async def main(): app = gradio_app() app.launch() if __name__ == "__main__": import platform if platform.system() == "Emscripten": asyncio.ensure_future(main()) else: asyncio.run(main())