Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve scraping of spisbedre.dk #1489

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
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
62 changes: 52 additions & 10 deletions recipe_scrapers/spisbedre.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from ._abstract import AbstractScraper
from ._grouping_utils import IngredientGroup
from ._utils import get_equipment


class SpisBedre(AbstractScraper):
Expand All @@ -28,7 +29,11 @@ def total_time(self):
return self.schema.total_time()

def yields(self):
return self.schema.yields()
servings = int(self.recipe_json.get("serving_size"))
yield_type = (
"item" if self.recipe_json.get("serving_size_unit_id") != 1 else "serving"
)
return f"{servings} {yield_type}{'s' if servings != 1 else ''}"

def ingredients(self):
result = []
Expand Down Expand Up @@ -81,10 +86,20 @@ def unit_label(amount, inflection, texts):

total_amount = amount = ingredient.get("amount")
if amount:
total_amount = amount * servings
if int(total_amount) == total_amount:
total_amount = int(total_amount)
ingredient_elements.append(str(total_amount))
total_amount = round(amount * servings, 2)
# Formatting amount using same logic as the website
formatted_amount = (
str(total_amount)
.replace(".", ",")
.replace(",0", "")
.replace("0,25", "¼")
.replace("0,5", "½")
.replace("0,75", "¾")
.replace(",25", "¼")
.replace(",5", "½")
.replace(",75", "¾")
)
ingredient_elements.append(formatted_amount)

# For some reason unit_id 21 isn't rendered on the site, so we filter it as well
if ingredient.get("unit_id") != 21:
Expand Down Expand Up @@ -125,11 +140,12 @@ def unit_label(amount, inflection, texts):
]

def instructions(self):
result = []
for group in self.recipe_json.get("grouped_instructions", []):
for instruction in group.get("instructions", []):
if instruction.get("instruction"):
result.append(instruction.get("instruction"))
result = [
instruction.get("instruction")
for group in self.recipe_json.get("grouped_instructions", [])
for instruction in group.get("instructions", [])
if instruction.get("instruction")
]

return "\n".join(result)

Expand All @@ -141,3 +157,29 @@ def cuisine(self):

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

def equipment(self):
result = [
equipment.get("name")
for group in self.recipe_json.get("grouped_equipment", [])
for equipment in group.get("equipment", [])
if equipment.get("name")
]
return get_equipment(result)

def nutrients(self):
nutrition = self.recipe_json.get("nutrition")
if not nutrition:
return None

calories = round(nutrition.get("calories"))
fat = round(nutrition.get("fat"))
carbohydrates = round(nutrition.get("carbohydrates"))
protein = round(nutrition.get("protein"))

return {
"calories": f"{calories} kcal",
"fatContent": f"{fat} g",
"carbohydrateContent": f"{carbohydrates} g",
"proteinContent": f"{protein} g",
}
89 changes: 89 additions & 0 deletions tests/test_data/spisbedre.dk/spisbedre_3.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
{
"author": "Camilla Biesbjerg Markussen",
"canonical_url": "https://spisbedre.dk/opskrifter/fastelavnsboller-med-lemoncurd-og-braendt-marengs",
"site_name": "SPIS BEDRE",
"host": "spisbedre.dk",
"language": "da",
"title": "Fastelavnsboller med lemoncurd og brændt marengs",
"ingredients": [
"75 g smør",
"2½ dl mælk",
"50 g gær",
"125 g yoghurt naturel 3,5 %",
"1 æg",
"2 spsk. sukker",
"2 spsk. vaniljesukker",
"½ tsk. salt",
"600 g hvedemel",
"½ dl mælk til pensling",
"3 usprøjtede citroner",
"200 g sukker",
"2 æg",
"75 g smør",
"300 g sukker",
"1 vaniljestang",
"1 dl vand",
"150 g pasteuriserede æggehvider"
],
"ingredient_groups": [
{
"ingredients": [
"75 g smør",
"2½ dl mælk",
"50 g gær",
"125 g yoghurt naturel 3,5 %",
"1 æg",
"2 spsk. sukker",
"2 spsk. vaniljesukker",
"½ tsk. salt",
"600 g hvedemel",
"½ dl mælk til pensling"
],
"purpose": "Vaniljeboller"
},
{
"ingredients": [
"3 usprøjtede citroner",
"200 g sukker",
"2 æg",
"75 g smør"
],
"purpose": "Lemoncurd"
},
{
"ingredients": [
"300 g sukker",
"1 vaniljestang",
"1 dl vand",
"150 g pasteuriserede æggehvider"
],
"purpose": "Brændt marengs"
}
],
"instructions_list": [
"Smelt smørret, og rør det sammen med mælken, til blandingen er lun. Rør gæren ud i mælkeblandingen, tilsæt yoghurt, æg, sukker, vaniljesukker og salt, og rør godt. Tilsæt hvedemelet lidt ad gangen, og ælt dejen godt sammen, til den er glat og smidig. Dæk skålen med et rent, fugtigt viskestykke, og lad dejen hæve et lunt sted i 1 time.",
"Tag dejen ud på bordet, og tril den til lige store boller. Sæt dem på en bageplade beklædt med bagepapir, dæk med et rent, fugtigt viskestykke, og lad bollerne hæve i 30 minutter. Pensl bollerne med mælk, og bag dem i en 200° varm ovn i 10-12 minutter. Afkøl på en rist.",
"Riv citronskallen fint, og pres saften af citronerne. Varm forsigtigt citronskal, citronsaft, sukker og æg op i en gryde ved svag varme. Tilsæt smør skåret i små tern, og pisk konstant over middel varme i ca. 10 minutter, til smørret er smeltet, og massen er tyknet. Det må ikke komme helt op at koge, for så skiller cremen!",
"Tag gryden af varmen, hæld citroncremen på et rent glas, og sæt låg på. Lad citroncremen blive helt kold i køleskabet.",
"Skær toppen af på hver bolle med en savtakket brødkniv (gem toppen!). Skrab forsigtigt en smule af indmaden ud af hver bolle. Læg ca. 2 tsk. lemoncurd i hullet på hver bolle, og læg toppen af bollen på igen.",
"Flæk vaniljestangen, og skrab kornene ud. Bland sukker, vaniljekorn og vand i en gryde, og bring det i kog. Lad det koge, til sukkeret er smeltet, og temperaturen er på 120° (brug et sukker- eller stegetermometer). Pisk æggehviderne helt stive i en ren skål med en elpisker (eller på en røremaskine). Tilsæt den varme sukkerlage i en tynd stråle, mens du pisker kraftigt i 5-7 minutter. Pisk, indtil marengsen er blank og meget fast.",
"Fyld marengsen i en sprøjtepose, og sprøjt den ud i pæne toppe oven på hver bolle. Brænd marengsen med en lille gasbrænder, så den får gyldne kanter. Servér fastelavnsbollerne straks med en god skefuld lemoncurd på toppen."
],
"category": "Desserter, Kager, Fastelavnsboller",
"yields": "12 items",
"description": "Du kender de traditionelle danske fastelavnsboller, men du har sikkert ikke smagt vores engelske fortolkning med lemoncurd og brændt marengs. Forandring fryder!",
"total_time": 60,
"ratings": 4.0,
"ratings_count": 2,
"equipment": [
"en lille créme brûée-gasbrænder",
"et sukker eller stegetermometer"
],
"nutrients": {
"calories": "390 kcal",
"fatContent": "16 g",
"carbohydrateContent": "43 g",
"proteinContent": "5 g"
},
"image": "https://spisbedre-production-app.imgix.net/images/recipes/fastelavnsboller-med-lemoncurd-og-braendt-marengs_2317.jpg?fit=crop&crop=focalpoint&fp-x=0.5&fp-y=0.5501708984375&fp-z=1"
}
1,248 changes: 1,248 additions & 0 deletions tests/test_data/spisbedre.dk/spisbedre_3.testhtml

Large diffs are not rendered by default.