import requests from bs4 import BeautifulSoup import json import sys HEADERS = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", } def fetch_url(url, timeout=20): try: resp = requests.get(url, headers=HEADERS, timeout=timeout) resp.encoding = resp.apparent_encoding or 'utf-8' return resp.text except Exception as e: print(f"ERROR: {url}: {e}", file=sys.stderr) return None def get_fulltext(html): soup = BeautifulSoup(html, 'html.parser') for selector in ["article", ".article-content", ".post-content", ".entry-content", ".news-content", ".article-body", ".story-body", "main", ".content", "#content"]: content_el = soup.select_one(selector) if content_el: for unwanted in content_el.select("script, style, nav, .ad, .advertisement, .comments, .related"): unwanted.decompose() text = content_el.get_text(separator="\n", strip=True) if len(text) > 200: return text[:5000] paragraphs = soup.select("article p, .content p, main p") if paragraphs: return "\n".join(p.get_text(strip=True) for p in paragraphs[:20])[:5000] return "" # Fetch remaining gladbachlive articles urls = [ ("Wird der WM-Traum wahr? Gladbach-Star vor Duell mit Fohlen-Kollegen", "https://www.gladbachlive.de/news/wird-der-wm-traum-wahr-gladbach-star-vor-duell-mit-fohlen-kollegen-1296117"), ("Große Begehrlichkeit geweckt: Borussia-Talent vor dem Absprung?", "https://www.gladbachlive.de/news/grosse-begehrlichkeit-geweckt-borussia-talent-vor-dem-absprung-1295909"), ("Gladbacher vor der WM: Elvedi-Truppe patzt", "https://www.gladbachlive.de/news/gladbacher-vor-der-wm-elvedi-truppe-patzt-gegen-aussenseiter-1295352"), ("Fohlenelf vor machbarer Aufgabe im DFB-Pokal", "https://www.gladbachlive.de/news/in-bundesliga-stadion-gladbach-vor-machbarer-aufgabe-im-dfb-pokal-1295280"), ("Hüne aus Belgien als Verstärkung für die Abwehr?", "https://www.gladbachlive.de/news/geruechte-in-gladbach-abwehr-huene-als-defensiv-verstaerkung-1295178"), ] results = {} for title, url in urls: print(f"Fetching: {url}", file=sys.stderr) html = fetch_url(url) if html: ft = get_fulltext(html) results[url] = {"title": title, "fulltext": ft, "length": len(ft)} print(f" Got {len(ft)} chars", file=sys.stderr) # Also get TorFabrik article torfabrik_url = "https://www.torfabrik.de/" html = fetch_url(torfabrik_url) if html: soup = BeautifulSoup(html, 'html.parser') # Find the top article link top_news = soup.select_one(".top-news a") or soup.select_one("h1 a, .news-header a") if top_news and top_news.get("href"): article_url = "https://www.torfabrik.de" + top_news["href"] if not top_news["href"].startswith("http") else top_news["href"] print(f"Fetching TorFabrik article: {article_url}", file=sys.stderr) article_html = fetch_url(article_url) if article_html: ft = get_fulltext(article_html) results[article_url] = {"title": "Borussia verpflichtet Isac Lidberg", "fulltext": ft, "length": len(ft)} print(f" Got {len(ft)} chars", file=sys.stderr) # Save results with open("/home/hermes/workspace/more_fulltext.json", "w") as f: json.dump(results, f, ensure_ascii=False, indent=2) # Print summary for url, data in results.items(): print(f"\n{'='*60}") print(f"TITLE: {data['title']}") print(f"URL: {url}") print(f"LENGTH: {data['length']} chars") print(f"TEXT:\n{data['fulltext'][:1000]}")