From 5f8f0b8fcc374993682284c701c34ce95138e48f Mon Sep 17 00:00:00 2001 From: Andrew Pachuilo Date: Sun, 24 Jul 2022 08:27:34 -0500 Subject: [PATCH] ah.nl: added support for recipes missing schema.org instructions (#580) --- README.rst | 1 + recipe_scrapers/__init__.py | 2 + recipe_scrapers/albertheijn.py | 61 +++++++ tests/test_albertheijn.py | 62 ++++++++ tests/test_data/albertheijn.testhtml | 227 +++++++++++++++++++++++++++ 5 files changed, 353 insertions(+) create mode 100644 recipe_scrapers/albertheijn.py create mode 100644 tests/test_albertheijn.py create mode 100644 tests/test_data/albertheijn.testhtml diff --git a/README.rst b/README.rst index d5db0a7f4..d4e3e4b1b 100644 --- a/README.rst +++ b/README.rst @@ -85,6 +85,7 @@ Scrapers available for: - `https://www.acouplecooks.com `_ - `http://www.afghankitchenrecipes.com/ `_ - `https://akispetretzikis.com/ `_ +- `https://ah.nl/ `_ - `https://allrecipes.com/ `_ - `https://alltommat.se/ `_ - `https://altonbrown.com/ `_ diff --git a/recipe_scrapers/__init__.py b/recipe_scrapers/__init__.py index 0204b0208..f4976dc0f 100644 --- a/recipe_scrapers/__init__.py +++ b/recipe_scrapers/__init__.py @@ -9,6 +9,7 @@ from .acouplecooks import ACoupleCooks from .afghankitchenrecipes import AfghanKitchenRecipes from .akispetretzikis import AkisPetretzikis +from .albertheijn import AlbertHeijn from .allrecipes import AllRecipes from .alltomat import AllTomat from .altonbrown import AltonBrown @@ -212,6 +213,7 @@ Abril.host(): Abril, AfghanKitchenRecipes.host(): AfghanKitchenRecipes, AkisPetretzikis.host(): AkisPetretzikis, + AlbertHeijn.host(): AlbertHeijn, AllRecipes.host(): AllRecipes, AllTomat.host(): AllTomat, AltonBrown.host(): AltonBrown, diff --git a/recipe_scrapers/albertheijn.py b/recipe_scrapers/albertheijn.py new file mode 100644 index 000000000..e4aca74a3 --- /dev/null +++ b/recipe_scrapers/albertheijn.py @@ -0,0 +1,61 @@ +import re + +from ._abstract import AbstractScraper +from ._utils import normalize_string + + +class AlbertHeijn(AbstractScraper): + @classmethod + def host(cls): + return "ah.nl" + + def author(self): + return self.schema.author() + + def title(self): + return self.schema.title() + + def category(self): + return self.schema.category() + + def total_time(self): + return self.schema.total_time() + + def yields(self): + return self.schema.yields() + + def image(self): + return self.schema.image() + + def ingredients(self): + return self.schema.ingredients() + + def instructions(self): + # try schema.org + instructions = self.schema.instructions() + if instructions: + return instructions + + instructions = [ + step + # get steps root + for root in self.soup.findAll( + "div", + {"class", re.compile("recipe-preparation-steps_root.*")}, + ) + # get steps + for step in root.findAll("p") + ] + + return "\n".join( + [normalize_string(instruction.get_text()) for instruction in instructions] + ) + + def ratings(self): + return self.schema.ratings() + + def cuisine(self): + return self.schema.cuisine() + + def description(self): + return self.schema.description() diff --git a/tests/test_albertheijn.py b/tests/test_albertheijn.py new file mode 100644 index 000000000..27fb186d6 --- /dev/null +++ b/tests/test_albertheijn.py @@ -0,0 +1,62 @@ +from recipe_scrapers.albertheijn import AlbertHeijn +from tests import ScraperTest + + +class TestAlbertHeijnScraper(ScraperTest): + + scraper_class = AlbertHeijn + + def test_host(self): + self.assertEqual("ah.nl", self.harvester_class.host()) + + def test_author(self): + self.assertEqual("Albert Heijn", self.harvester_class.author()) + + def test_title(self): + self.assertEqual("Kruidige groentecalzone", self.harvester_class.title()) + + def test_category(self): + self.assertEqual("hoofdgerecht", self.harvester_class.category()) + + def test_total_time(self): + self.assertEqual(35, self.harvester_class.total_time()) + + def test_yields(self): + self.assertEqual("2 servings", self.harvester_class.yields()) + + def test_image(self): + self.assertEqual( + "https://static.ah.nl/static/recepten/img_001329_890x594_JPG.jpg", + self.harvester_class.image(), + ) + + def test_ingredients(self): + self.assertEqual( + [ + "1 kleine rode ui", + "1 courgette", + "1 rode paprika", + "0.5 eetlepel Italiaanse kruiden", + "2 eetlepels olijfolie", + "2 theelepels knoflookpuree", + "1 pakje pizza & tomato", + "1 pakje walnootkaas", + "0.5 eetlepel olie om in te vetten", + ], + self.harvester_class.ingredients(), + ) + + def test_instructions(self): + self.assertEqual( + "Oven voorverwarmen op 200 °C of gasovenstand 4. Ui, courgette en paprika schoonmaken en in kleine blokjes snijden. In kom groenten, kruiden, olijfolie, knoflookpuree en inhoud van potje tomatensaus door elkaar scheppen.Op aanrecht pizzadeeg uitspreiden, iets uitrollen en in twee gelijke stukken snijden. Plakken kaas naast elkaar erop leggen, ca. 2 cm van randen vrijhouden. Op helft van elk stuk courgettemengsel scheppen. Andere helft over vulling klappen en randen van deeg tussen duim en wijsvinger tot mooie schulprand dichtknijpen. Bakplaat invetten. Calzones erop leggen en in midden van oven in ca. 25 minuten goudbruin en gaarbakken.", + self.harvester_class.instructions(), + ) + + def test_ratings(self): + self.assertEqual(3.08, self.harvester_class.ratings()) + + def test_cuisine(self): + self.assertEqual("italiaans", self.harvester_class.cuisine()) + + def test_description(self): + self.assertEqual("", self.harvester_class.description()) diff --git a/tests/test_data/albertheijn.testhtml b/tests/test_data/albertheijn.testhtml new file mode 100644 index 000000000..280ff7b8a --- /dev/null +++ b/tests/test_data/albertheijn.testhtml @@ -0,0 +1,227 @@ + + + + + + + + Kruidige groentecalzone recept - Allerhande | Albert Heijn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
bewaar
Kruidige groentecalzone
Kruidige groentecalzone
bewaar

Kruidige groentecalzone

35 min. bereiden
36waarderingen

Ingrediënten

2 personen

1 kleine

rode ui

1

courgette

1

rode paprika

½ eetlepel

Italiaanse kruiden

2 eetlepels

olijfolie

2 theelepels

knoflookpuree

1 pakje

pizza & tomato

1 pakje

walnootkaas

½ eetlepel

olie om in te vetten

Aan de slag

Oven voorverwarmen op 200 °C of gasovenstand 4. Ui, courgette en paprika schoonmaken en in kleine blokjes snijden. In kom groenten, kruiden, olijfolie, knoflookpuree en inhoud van potje tomatensaus door elkaar scheppen.Op aanrecht pizzadeeg uitspreiden, iets uitrollen en in twee gelijke stukken snijden. Plakken kaas naast elkaar erop leggen, ca. 2 cm van randen vrijhouden. Op helft van elk stuk courgettemengsel scheppen. Andere helft over vulling klappen en randen van deeg tussen duim en wijsvinger tot mooie schulprand dichtknijpen. Bakplaat invetten. Calzones erop leggen en in midden van oven in ca. 25 minuten goudbruin en gaarbakken.

Kruidige groentecalzone

Lekker van Albert Heijn: https://www.ah.nl/allerhande

Dit heb je nodig

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