Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions recipe_scrapers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,7 @@
from .thewoodenskillet import TheWoodenSkillet
from .thinlicious import Thinlicious
from .thishealthytable import ThisHealthyTable
from .thomaskocht import ThomasKocht
from .threesixfivedaysofbakingandmore import ThreeSixFiveDaysOfBakingAndMore
from .tidymom import TidyMom
from .timesofindia import TimesOfIndia
Expand Down Expand Up @@ -1223,6 +1224,7 @@
TheWoodenSkillet.host(): TheWoodenSkillet,
Thinlicious.host(): Thinlicious,
ThisHealthyTable.host(): ThisHealthyTable,
ThomasKocht.host(): ThomasKocht,
ThreeSixFiveDaysOfBakingAndMore.host(): ThreeSixFiveDaysOfBakingAndMore,
TidyMom.host(): TidyMom,
TimesOfIndia.host(): TimesOfIndia,
Expand Down
106 changes: 106 additions & 0 deletions recipe_scrapers/thomaskocht.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import re

from ._abstract import AbstractScraper
from ._utils import normalize_string


class ThomasKocht(AbstractScraper):
@classmethod
def host(cls):
return "thomas-kocht.de"

def author(self):
return "Thomas Kocht"

def title(self):
return self.schema.title()

def category(self):
return self.schema.category()

def total_time(self):
info = self._info_paragraph()
if not info:
return self.schema.total_time()
prep = re.search(r"Vorbereitungszeit:\s*(\d+)\s*Minuten", info)
cook = re.search(r"Kochzeit:\s*(\d+)\s*Minuten", info)
total = 0
if prep:
total += int(prep.group(1))
if cook:
total += int(cook.group(1))
return total or None

def yields(self):
info = self._info_paragraph()
if not info:
return self.schema.yields()
match = re.search(r"Ergibt\s+(.+?)(?:\||$)", info)
if match:
return normalize_string(match.group(1))
return None

def image(self):
return self.schema.image()

def ingredients(self):
heading = self.soup.find(
"h3", string=lambda t: t and t.strip().startswith("Zutaten")
)
if not heading:
return self.schema.ingredients()
ul = heading.find_next_sibling("ul")
if not ul:
return self.schema.ingredients()
return [
normalize_string(li.get_text())
for li in ul.find_all("li")
if li.get_text(strip=True)
]

def instructions(self):
steps = []
for title_div in self.soup.find_all("div", class_="fusion-title"):
h2 = title_div.find("h2")
if not h2:
continue
if not re.match(r"Schritt\s+\d+", h2.get_text(strip=True)):
continue
for sibling in title_div.next_siblings:
if not hasattr(sibling, "name") or not sibling.name:
continue
classes = sibling.get("class", [])
if any("fusion-text" in c for c in classes):
step_parts = []
h4 = sibling.find("h4")
if h4:
step_parts.append(normalize_string(h4.get_text()))
for p in sibling.find_all("p"):
text = normalize_string(p.get_text())
if text:
step_parts.append(text)
if step_parts:
steps.append(" ".join(step_parts))
break
if sibling.name == "div" and any("fusion-title" in c for c in classes):
break
return "\n".join(steps)

def ratings(self):
return self.schema.ratings()

def cuisine(self):
return self.schema.cuisine()

def description(self):
return self.schema.description()

def site_name(self):
return self.schema.site_name()

def _info_paragraph(self):
for p in self.soup.find_all("p"):
text = p.get_text(strip=True)
if "Vorbereitungszeit" in text or "Kochzeit" in text:
return text
return None
27 changes: 27 additions & 0 deletions tests/test_data/thomas-kocht.de/thomaskocht.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"author": "Thomas Kocht",
"canonical_url": "https://thomas-kocht.de/rezepte/pfannkuchen-mit-diesen-tricks-werden-sie-perfekt/",
"site_name": "Thomas kocht - der Kochkanal auf Youtube",
"host": "thomas-kocht.de",
"language": "de-DE",
"title": "Pfannkuchen – mit diesen Tricks werden sie perfekt",
"ingredients": [
"200 g Weizenmehl (Typ 550, alternativ Dinkelmehl Typ 630)",
"350 ml Milch (ggf. etwas mehr, um die Konsistenz anzupassen)",
"40 g Butter (für die Nussbutter)",
"15 g Zucker (ca. 1 EL)",
"1 Prise Salz",
"2 Eier (Größe M)"
],
"instructions_list": [
"Nussbutter herstellen Butter in einem Topf bei mittlerer Hitze schmelzen lassen, bis die Molke karamellisiert und die Butter eine goldbraune Farbe bekommt. Die geschmolzene Butter durch ein feines Sieb und ein halbiertes Küchenpapier filtern, um die festen Bestandteile zu entfernen. Die Nussbutter leicht abkühlen lassen. Ich mache immer etwas mehr und gebe sie z.B. in Eiswürfelformen. So kannst du sie im Kühlschrank ohne Probleme mehrere Wochen aufbewahren oder auch einfrieren. Ihr könnt die Pfannkuchen natürlich auch einfach mit geschmolzener Butter machen, wenn es mal schneller gehen soll.",
"Teig zubereiten Mehl, Zucker, Salz und Eier in eine Schüssel geben. Etwa die Hälfte der Milch hinzugeben und kräftig mit einem Schneebesen schlagen, bis ein dickflüssiger Teig entsteht – ähnlich einem Spätzleteig. So lange schlagen, bis der teig klumpenfrei ist (keine Angst, das geht schnell). Dann die restliche Milch einrühren, bis der Teig die gewünschte Konsistenz hat. Dann die Nussbutter einrühren. Es geht aber auch einfach mit flüssiger Butter, wenn es mal schnell gehen soll. Der Teig sollte so flüssig sein, dass er sich leicht in der Pfanne verteilen lässt. Kein Sieben mehr nötig!",
"Pfannkuchen backen Eine beschichtete Pfanne* (28 cm Durchmesser) bei mittlerer Hitze vorheizen. Für den ersten Pfannkuchen ein kleines Stück Butter hineingeben und mit einem Küchentuch gleichmäßig ausreiben, sodass nur ein dünner Film zurückbleibt. Den Teig mit einer Schöpfkelle in die heiße Pfanne geben, dabei den Teig durch Schwenken gleichmäßig verteilen. Die Hitze reduzieren und den Pfannkuchen backen, bis sich die Ränder leicht lösen. Den Pfannkuchen mit einem Pfannenwender wenden und die zweite Seite kurz ausbacken. Wiederhole den Vorgang, bis der gesamte Teig aufgebraucht ist."
],
"yields": "6-8 Stück",
"description": "Pfannkuchen – mit diesen Tricks werden sie perfekt",
"total_time": 25,
"ratings": 4.4,
"ratings_count": 59,
"image": "https://thomas-kocht.de/wp-content/uploads/2025/01/Pfannkuchen_Thomas_Kocht_Rezept_1.jpg"
}
Loading