Spaces:
Sleeping
Sleeping
| from flask import Flask, jsonify | |
| import requests | |
| from bs4 import BeautifulSoup | |
| import time | |
| app = Flask(__name__) | |
| KEYWORDS = ["élection présidentielle", "présidentielle", "élections présidentielles", | |
| "élection législative", "législative", "élections législatives"] | |
| def get_articles(): | |
| url = "https://lesoleil.sn/rubriques/actualites/politique/" | |
| 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' | |
| } | |
| try: | |
| # Récupérer la page | |
| response = requests.get(url, headers=headers, timeout=10) | |
| if response.status_code != 200: | |
| print(f"Erreur lors de la récupération de la page principale: {response.status_code}") | |
| return [] | |
| soup = BeautifulSoup(response.text, 'html.parser') | |
| article_links = [] | |
| # Trouver tous les liens d'articles | |
| link_elements = soup.select("a.elementor-cta") | |
| for link in link_elements: | |
| href = link.get('href') | |
| if href and href not in article_links: | |
| article_links.append(href) | |
| print(f"Nombre de liens trouvés: {len(article_links)}") | |
| results = [] | |
| for link in article_links: | |
| try: | |
| article_response = requests.get(link, headers=headers, timeout=10) | |
| if article_response.status_code != 200: | |
| print(f"Erreur lors de la récupération de l'article {link}: {article_response.status_code}") | |
| continue | |
| article_soup = BeautifulSoup(article_response.text, 'html.parser') | |
| # Essayer différentes sélections pour trouver le titre | |
| title_element = article_soup.select_one("h1.td-page-title") or article_soup.select_one("h1") | |
| if not title_element: | |
| print(f"Pas de titre trouvé pour {link}") | |
| continue | |
| title = title_element.text.strip() | |
| # Essayer différentes sélections pour trouver le contenu | |
| content_div = article_soup.select_one("div.td-post-content") or article_soup.select_one( | |
| "div.elementor-widget-theme-post-content") | |
| if not content_div: | |
| print(f"Pas de contenu trouvé pour {link}") | |
| continue | |
| content = content_div.text.strip() | |
| combined_text = f"{title.lower()} {content.lower()}" | |
| # Vérifier si le contenu est lié aux élections | |
| if any(keyword in combined_text for keyword in KEYWORDS): | |
| paragraphs = content.split("\n") | |
| description = paragraphs[0] if paragraphs else "" | |
| results.append({ | |
| "title": title, | |
| "description": description, | |
| "content": content, | |
| "url": link | |
| }) | |
| print(f"Article trouvé sur les élections: {title}") | |
| # Attendre un peu pour ne pas surcharger le serveur | |
| time.sleep(1) | |
| except Exception as e: | |
| print(f"Erreur pour {link}: {str(e)}") | |
| print(f"Nombre total d'articles sur les élections trouvés: {len(results)}") | |
| return results | |
| except Exception as e: | |
| print(f"Erreur générale: {str(e)}") | |
| return [] | |
| def index(): | |
| return """ | |
| <html> | |
| <head> | |
| <title>API d'articles sur les élections</title> | |
| <style> | |
| body { font-family: Arial, sans-serif; margin: 40px; line-height: 1.6; } | |
| h1 { color: #333; } | |
| .endpoint { background: #f4f4f4; padding: 10px; border-radius: 5px; } | |
| .description { margin-bottom: 20px; } | |
| </style> | |
| </head> | |
| <body> | |
| <h1>API d'articles sur les élections</h1> | |
| <div class="description"> | |
| Cette API extrait des articles liés aux élections du site LeSOLEIL.sn | |
| </div> | |
| <div class="endpoint"> | |
| Endpoint: <a href="/api/election-articles">/api/election-articles</a> - Récupérer tous les articles sur les élections | |
| </div> | |
| </body> | |
| </html> | |
| """ | |
| def get_election_articles(): | |
| articles = get_articles() | |
| return jsonify(articles) | |
| if __name__ == '__main__': | |
| app.run(host="0.0.0.0", debug=True, port=5000) |