From 374d3101814a713b17aa142d7af5dd12e897afd7 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Fri, 30 Sep 2022 18:27:29 +0200 Subject: [PATCH 1/6] fixes #448 by allowing to import body text of lecker de articles lecker.de contains articles that are not formatted in a way that structured data can be extraceted. this allows to load the data into the instructions so that a mostly useful recipe is returned --- recipe_scrapers/lecker.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/recipe_scrapers/lecker.py b/recipe_scrapers/lecker.py index 611b39c9a..9096e79db 100644 --- a/recipe_scrapers/lecker.py +++ b/recipe_scrapers/lecker.py @@ -12,7 +12,10 @@ def author(self): return self.schema.author() def title(self): - return self.schema.title() + try: + return self.schema.title() + except TypeError: + return self.soup.find('header', {'class': 'article-header article-header--article'}).find('h1').get_text() def category(self): return self.schema.category() @@ -24,7 +27,10 @@ def cook_time(self): return self.schema.cook_time() def total_time(self): - return self.schema.total_time() + try: + return self.schema.total_time() + except SchemaOrgException: + return 0 def yields(self): return self.schema.yields() @@ -36,7 +42,13 @@ def ingredients(self): return self.schema.ingredients() def instructions(self): - return self.schema.instructions() + if self.schema.instructions(): + return self.schema.instructions() + else: + divs = self.soup.find_all('div', {'class': 'js-quizToggle'}) + for d in divs: + if d.find('span', 'article__shifted-jump-label'): + return d.get_text() def ratings(self): return self.schema.ratings() From 2e33b5d288a8f752c2a7d397d861df7c2cb4da94 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Sat, 1 Oct 2022 10:21:31 +0200 Subject: [PATCH 2/6] raise exception if calling total time on lecker de articles instead of returning 0 --- recipe_scrapers/lecker.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/recipe_scrapers/lecker.py b/recipe_scrapers/lecker.py index 9096e79db..e9b43dc97 100644 --- a/recipe_scrapers/lecker.py +++ b/recipe_scrapers/lecker.py @@ -27,10 +27,7 @@ def cook_time(self): return self.schema.cook_time() def total_time(self): - try: - return self.schema.total_time() - except SchemaOrgException: - return 0 + return self.schema.total_time() def yields(self): return self.schema.yields() From 1b26d6a76c03b446cb4b9ba6d3b9a58bb876b819 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Sat, 1 Oct 2022 16:18:37 +0200 Subject: [PATCH 3/6] added simple test case for lecker de article parser --- .../{lecker.testhtml => lecker_1.testhtml} | 24 +- tests/test_data/lecker_2.testhtml | 1878 +++++++++++++++++ tests/{test_lecker.py => test_lecker_1.py} | 4 + tests/test_lecker_2.py | 38 + 4 files changed, 1932 insertions(+), 12 deletions(-) rename tests/test_data/{lecker.testhtml => lecker_1.testhtml} (99%) create mode 100644 tests/test_data/lecker_2.testhtml rename tests/{test_lecker.py => test_lecker_1.py} (96%) create mode 100644 tests/test_lecker_2.py diff --git a/tests/test_data/lecker.testhtml b/tests/test_data/lecker_1.testhtml similarity index 99% rename from tests/test_data/lecker.testhtml rename to tests/test_data/lecker_1.testhtml index ca395000c..701e42bf2 100644 --- a/tests/test_data/lecker.testhtml +++ b/tests/test_data/lecker_1.testhtml @@ -276,20 +276,20 @@ jQuery.extend(Drupal.settings, {"basePath":"\/","pathPrefix":"","setHasJsCookie" bdu_screen_init(); if (bdu_screen == 'smartphone') { - var iam_data = { -"st":"moblecke", -"cp":"LE_Rezepte_Einzel", -"sv":"mo", -"sc":"yes" -} + var iam_data = { +"st":"moblecke", +"cp":"LE_Rezepte_Einzel", +"sv":"mo", +"sc":"yes" +} iom.h(iam_data); } else { - var iam_data = { -"st":"leckerde", -"cp":"LE_Rezepte_Einzel", -"sv":"in", -"sc":"yes" -} + var iam_data = { +"st":"leckerde", +"cp":"LE_Rezepte_Einzel", +"sv":"in", +"sc":"yes" +} iom.c(iam_data); } //--> diff --git a/tests/test_data/lecker_2.testhtml b/tests/test_data/lecker_2.testhtml new file mode 100644 index 000000000..53114b870 --- /dev/null +++ b/tests/test_data/lecker_2.testhtml @@ -0,0 +1,1878 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Naan-Brot backen - so geht das Rezept | LECKER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ close + + +
+ Schön, dass du auf unserer Seite bist! Wir wollen dir auch weiterhin beste Unterhaltung und tollen Service bieten. +
+
+ Danke, dass du uns dabei unterstützt. + Dafür musst du nur für www.lecker.de deinen Ad-Blocker deaktivieren.
Geht auch ganz einfach: +
+ +
    +
  • + adblock + 1. Klicke neben der Adresszeile rechts auf das Ad-Blocker-Symbol. +
  • +
  • + adblock deactivate + 2. Wähle die Option "Deaktivieren auf: www.lecker.de". +
  • +
+ +
+
+ + + + + +
+ +
+
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+ +
+
+ +
+ +
+ +
+
+ +
  • Backen
  • +
  • Brot & Brötchen
  • +
  • Naan-Brot backen - so geht das Rezept
  • +
+ +
+
+ + + + + +
+
+
+ + + + + +
+ + +
+ + +

Naan-Brot backen - so geht das Rezept

+
+ +
+ +
+ +
+ + + + + +
+ +
+
+

Ein Muss beim Inder: frisches Naan-Brot. Der krosse und zugleich leichte Teigfladen schmeckt zu deftigen Fleischgerichten und Currys. Mit unserer Schritt für Schritt-Anleitung kannst du Naan-brot jetzt auch zuhause backen.

+
+ + +
+
+ + +
+ Video Platzhalter +
+ +
+
+ + + + + + +
+
+ + +
+
+  

Was ist eigentlich Naan-Brot?

Als Naan-Brot bezeichnet man dünne Teigfladen aus mit Joghurt gesäuertem Hefeteig, die traditionell über dem offenen Feuer gebacken werden. In unserem Rezept übernimmt diesen Part eine heiße Pfanne. Einfaches Naan-Brot wird ausschließlich mit Salz gewürzt und typischerweise als Beilage zu heißen Gerichten wie Currys und Fleischgerichten gereicht werden.

 

Naan-Brot Rezept - Zutaten für 6 Stück:

  • 75 ml Milch
  • 1 TL Zucker
  • 1 TL Trockenhefe
  • 1/2 TL Salz
  • 250 g + etwas Mehl
  • 1 EL Öl
  • 75 g Vollmilchjoghurt
  • 1 Ei (Gr. M)
 

Naan-Brot Rezept - Schritt 1:

Zutaten verrühren
Erst kommt der Löffel - dann die Hände zum Einsatz

Den Backofen auf ca. 50 °C vorheizen. 75 ml Milch lauwarm erwärmen und mit 1 TL Zucker sowie 1 TL Trockenhefe verrühren. Anschließend 25 Minuten ruhen lassen. 250 g Mehl und 1/2 TL Salz mischen. Hefemilch, 1 EL Öl, 75 g Joghurt und 1 Ei zugeben. Die Teigzutaten mit einem Kochlöffel verrühren. Dann mit den Händen zu einem geschmeidigen, glatten Teig verkneten.

 

Naan-Brot Rezept - Schritt 2:

Den Teig für das Naan-Brot mit einem Küchentuch abdecken und im warmen Ofen ca. 1 Stunde gehen lassen, bis sich das Volumen verdoppelt hat. Den Teig nach dem Gehen auf einer bemehlten Arbeitsfläche noch einmal kräftig durchkneten. Dadurch wird er elastischer und besser formbar. Anschließend zu 6 Kugeln formen und diese nochmals 15 Minuten ruhen lassen.

Naan-Brot Rezept- Schritt 3:

Naan-Brot braten
Das Brot lässt sich am besten mit dem Pfannenwender drehen

Die Kugeln mit der Teigrolle jeweils zu ca. 1/2 cm dünnen ovalen Fladen à ca. 18 x 10 cm ausrollen. Eine Pfanne* ohne Fett erhitzen. Die Brotfladen darin bei starker Hitze nacheinander von jeder Seite 1-2 Minuten golbraun braten. Wenn das Brot blasen wirft, wenden und von der anderen Seite braten.

Tipps: Ein Pfanne aus Gusseisen ist aufgrund ihrer natürlichen Beschichtung am besten zum Braten von Naan-Brot geeignet. Mit frischem Koriander, Knoblauch oder Kümmel im Grundteig sorgst du je nach Gusto im Handumdrehen für geschmackliche Vielfalt.

+

 

Schnelle Teig-Variante mit Backpulver

Für die Zubereitung des Hefeteigs muss man etwas Zeit einplanen. Wenn es mal schnell gehen soll, kann man auch eine Naan-Brot-Variante mit Backpulver backen. Für das Rezept 250 g Mehl, 1 TL Zucker, 1 TL Backpulver sowie einen 1/2 TL Salz in einer Schüssel mischen. 75 g Vollmilchjoghurt zugeben und alles zunächst mit einem Kochlöffel verrühren und anschließen mit den Händen zu einem geschmeidigen Teig verkneten.

Aus dem Teig 6 gleich große Kugeln formen und diese auf bemehlter Arbeitsfläche mit der Teigrolle zu dünnen Fladen à ca. 18 x 10 cm ausrollen. Eine Pfanne erhitzen und die Brotfladen darin bei starker Hitze von jeder Seite 1-2 Minuten braten. Sobald das Brot blasen wirft, wenden und weiterbraten.

Tipp: Für echte Brotliebhaber empfehlen wir einen Brotbackautomaten

+

 

Und dazu schmeckt Naan-Brot besonders gut:

+

+

+
+ +
+ +
+ + Kategorie & Tags + + +
+ +
+ + Mehr zum Thema + +
+ +
+ +
+
+ + + +
+
+
+
+ +
+
+ + + + + +
+ +
+
+ +
+ + + +
+ Copyright 2022 LECKER.de. All rights reserved +
+
+
+ + + + + + + + + +
+ +
+ + + + + diff --git a/tests/test_lecker.py b/tests/test_lecker_1.py similarity index 96% rename from tests/test_lecker.py rename to tests/test_lecker_1.py index 2e74b44ba..6c286e006 100644 --- a/tests/test_lecker.py +++ b/tests/test_lecker_1.py @@ -6,6 +6,10 @@ class TestLeckerScraper(ScraperTest): scraper_class = Lecker + @property + def test_file_name(self): + return "{}_1".format(self.scraper_class.__name__.lower()) + def test_host(self): self.assertEqual("lecker.de", self.harvester_class.host()) diff --git a/tests/test_lecker_2.py b/tests/test_lecker_2.py new file mode 100644 index 000000000..5cf12971c --- /dev/null +++ b/tests/test_lecker_2.py @@ -0,0 +1,38 @@ +from recipe_scrapers.lecker import Lecker +from tests import ScraperTest + + +class TestLeckerScraper(ScraperTest): + + scraper_class = Lecker + + @property + def test_file_name(self): + return "{}_2".format(self.scraper_class.__name__.lower()) + + def test_host(self): + self.assertEqual("lecker.de", self.harvester_class.host()) + + def test_title(self): + self.assertEqual( + "Naan-Brot backen - so geht das Rezept", + self.harvester_class.title(), + ) + + def test_image(self): + self.assertEqual( + "https://www.lecker.de/assets/field/image/naan-brot-b_0.jpg", + self.harvester_class.image(), + ) + + def test_ingredients(self): + self.assertEqual( + [], + self.harvester_class.ingredients(), + ) + + def test_instructions(self): + self.assertIn( + "Als Naan-Brot bezeichnet man dünne Teigfladen aus m", + self.harvester_class.instructions(), + ) From 9c227189a0c69f130dc6da72fab61fdd9f9329da Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Sat, 1 Oct 2022 16:30:33 +0200 Subject: [PATCH 4/6] proper linting of lecker.de parser --- recipe_scrapers/lecker.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/recipe_scrapers/lecker.py b/recipe_scrapers/lecker.py index e9b43dc97..40e20c111 100644 --- a/recipe_scrapers/lecker.py +++ b/recipe_scrapers/lecker.py @@ -15,7 +15,13 @@ def title(self): try: return self.schema.title() except TypeError: - return self.soup.find('header', {'class': 'article-header article-header--article'}).find('h1').get_text() + return ( + self.soup.find( + "header", {"class": "article-header article-header--article"} + ) + .find("h1") + .get_text() + ) def category(self): return self.schema.category() @@ -42,9 +48,9 @@ def instructions(self): if self.schema.instructions(): return self.schema.instructions() else: - divs = self.soup.find_all('div', {'class': 'js-quizToggle'}) + divs = self.soup.find_all("div", {"class": "js-quizToggle"}) for d in divs: - if d.find('span', 'article__shifted-jump-label'): + if d.find("span", "article__shifted-jump-label"): return d.get_text() def ratings(self): From b7a35cfc47a884228d3ee04e9ae3a7473f85ac00 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Sat, 1 Oct 2022 18:51:37 +0200 Subject: [PATCH 5/6] updated lecker 1 test data and test --- tests/test_data/lecker_1.testhtml | 1055 ++++++++++++++++------------- tests/test_lecker_1.py | 2 +- 2 files changed, 586 insertions(+), 471 deletions(-) diff --git a/tests/test_data/lecker_1.testhtml b/tests/test_data/lecker_1.testhtml index 701e42bf2..9642c2260 100644 --- a/tests/test_data/lecker_1.testhtml +++ b/tests/test_data/lecker_1.testhtml @@ -1,3 +1,4 @@ + @@ -6,7 +7,7 @@ - + - - - + })(window,document,'script','dataLayer','GTM-M64G4V') + } + + if (readCookie('euconsent-v2') !== null && typeof google_tag_manager !== 'object') { + gtm() + } + + window.__tcfapi('addEventListener', 2, (tcData, success) => { + if (success && tcData.eventStatus === 'useractioncomplete') { + gtm() + } + }) + }()) + + @@ -51,8 +87,8 @@ - - + + Gemüsepfanne mit Hähnchen, Zuckerschoten und Brokkoli Rezept | LECKER @@ -123,23 +159,22 @@ - - - - + + + - - - + + + - - - - + + + +