URL zu Text: Webinhalte automatisch in Plaintext konvertieren

URL eingeben — sauberen, lesbaren Text erhalten. Ideal für Recherche & Archivierung.

Python BeautifulSoup Readability

🚀 URL rein — Text raus. So einfach kann Datenextraktion sein.

📞 02406 803 7603 ✉️ info@computerkumpel.de

💰 URL-zu-Text: Die Brücke zwischen Web und Daten

Webseiten sind für Browser optimiert, nicht für Datenverarbeitung. URL-zu-Text extrahiert den eigentlichen Inhalt — Hauptartikel, Metadaten und Kerntext — befreit von Navigation, Werbung und Scripten.

📰
Artikel extrahieren
Erkennt automatisch den Hauptinhalt — ignoriert Navigation, Sidebar, Footer und Werbung.
🔍
Intelligente Erkennung
Nutzt Readability-Algorithmus um den Hauptartikel von Boilerplate zu trennen — wie Safari Reader Mode.
🏷️
Metadaten
Extrahiert Titel, Autor, Veröffentlichkeitsdatum und Beschreibung aus Meta-Tags und Schema.org.
📚
Massenverarbeitung
Batch-Modus für hunderte URLs — ideal für Content-Migration, Research und Wettbewerbsanalyse.

⚙️ So funktioniert's

🔗
1. URL crawlen
Requests mit realistischem User-Agent — umgeht einfache Bot-Erkennung und Paywalls.
🧹
2. HTML bereinigen
Entfernt Scripte, Styles, Nav, Footer — behält nur den lesbaren Content-Bereich.
📝
3. Text formatieren
Markdown-Formatierung mit Überschriften, Absätzen und Listen — bereit zur Weiterverarbeitung.
📤
4. Export
Ausgabe als TXT, Markdown oder JSON — inklusive aller extrahierten Metadaten.

💻 Technische Umsetzung

🐍 URL-zu-Text Extraktor

import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import json
import re

class UrlToText:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                          'AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',
            'Accept-Language': 'de-DE,de;q=0.9,en;q=0.8',
        })
    
    def fetch(self, url: str) -> tuple:
        """Holt HTML und extrahiert Titel + Text"""
        response = self.session.get(url, timeout=15)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # Metadaten extrahieren
        title = self._get_title(soup)
        description = self._get_meta(soup, 'description')
        author = self._get_meta(soup, 'author')
        date = self._get_date(soup)
        
        # Hauptinhalt extrahieren
        content = self._extract_content(soup)
        
        return {
            'url': url,
            'domain': urlparse(url).netloc,
            'title': title,
            'description': description,
            'author': author,
            'date': date,
            'content': content,
            'word_count': len(content.split())
        }
    
    def _get_title(self, soup) -> str:
        """Extrahiert den Seitentitel"""
        if soup.title:
            return soup.title.string.strip()
        h1 = soup.find('h1')
        return h1.get_text().strip() if h1 else 'Kein Titel'
    
    def _get_meta(self, soup, name: str) -> str:
        """Holt Meta-Tag Inhalt"""
        tag = soup.find('meta', attrs={'name': name})
        if not tag:
            tag = soup.find('meta', attrs={'property': f'og:{name}'})
        return tag['content'].strip() if tag and tag.get('content') else ''
    
    def _get_date(self, soup) -> str:
        """Versucht das Publikationsdatum zu finden"""
        for selector in ['datePublished', 'article:published_time', 'pubdate']:
            tag = soup.find('meta', attrs={'property': selector})
            if tag and tag.get('content'):
                return tag['content']
        time_tag = soup.find('time')
        return time_tag.get('datetime', '') if time_tag else ''
    
    def _extract_content(self, soup) -> str:
        """Extrahiert den Hauptinhalt mit Readability-Ansatz"""
        # Entferne störende Elemente
        for tag in soup(['script', 'style', 'nav', 'footer', 'header']):
            tag.decompose()
        
        # Finde Hauptinhalt (article, main oder größter Textblock)
        article = soup.find('article') or soup.find('main') or soup
        
        # Extrahiere Text mit Struktur
        paragraphs = []
        for elem in article.find_all(['h1', 'h2', 'h3', 'p', 'li']):
            text = elem.get_text().strip()
            if text and len(text) > 20:  # Ignoriere zu kurze Texte
                if elem.name.startswith('h'):
                    paragraphs.append(f"\n## {text}\n")
                else:
                    paragraphs.append(text)
        
        return '\n\n'.join(paragraphs)
    
    def batch_extract(self, urls: list) -> list:
        """Extrahiert mehrere URLs"""
        results = []
        for url in urls:
            try:
                result = self.fetch(url)
                results.append(result)
                print(f"✓ {result['title'][:50]}... ({result['word_count']} Wörter)")
            except Exception as e:
                results.append({'url': url, 'error': str(e)})
                print(f"✗ {url}: {e}")
        return results

# Nutzung
extractor = UrlToText()
result = extractor.fetch('https://computerkumpel.de')
print(f"Titel: {result['title']}")
print(f"Wörter: {result['word_count']}")
print(f"Vorschau: {result['content'][:200]}...")

⚡ In 1–2 Tagen zum fertigen URL-Extraktor.

📞 02406 803 7603 ✉️ info@computerkumpel.de

Web zu Text — automatisiert und maßgeschneidert?

Content-Migration, Research-Tool oder News-Aggregator — ich baue den passenden Extraktor. Jetzt anfragen.

📞 02406 803 7603 ✉️ info@computerkumpel.de