#!/usr/bin/env python3 """Fetch the consolidated text of BNatSchG §44 and §45b from gesetze-im-internet.de and emit a plain-text file suitable for the bnatschg ingest loader. Usage: python scripts/fetch_bnatschg.py [--out sources/bnatschg/bnatschg.txt] The output uses one heading line per section ("§ N ..." or "Anlage N ...") exactly as the bnatschg loader's paragraph splitter expects. Best-effort HTML scrape. If gesetze-im-internet.de changes layout, paste text manually instead (see sources/README.md). """ from __future__ import annotations import argparse import re import sys from html.parser import HTMLParser from pathlib import Path from urllib.request import Request, urlopen # §s most relevant for Artenschutzgutachten. Add more as needed. SECTIONS = [ ("§ 44 Vorschriften für besonders geschützte und bestimmte andere Tier- und Pflanzenarten", "https://www.gesetze-im-internet.de/bnatschg_2009/__44.html"), ("§ 45 Ausnahmen; Ermächtigung zum Erlass von Rechtsverordnungen", "https://www.gesetze-im-internet.de/bnatschg_2009/__45.html"), ("§ 45b Schutz wild lebender Vogelarten bei der Errichtung und dem Betrieb von Windenergieanlagen an Land", "https://www.gesetze-im-internet.de/bnatschg_2009/__45b.html"), ("Anlage 1 (zu § 45b Absatz 1 bis 5) Liste der bei der Errichtung und dem Betrieb von Windenergieanlagen an Land kollisionsgefährdeten Brutvogelarten", "https://www.gesetze-im-internet.de/bnatschg_2009/anlage_1.html"), ] class TextExtractor(HTMLParser): def __init__(self) -> None: super().__init__() self._buf: list[str] = [] self._skip = 0 # depth of