Files
MealQuest/internal/recipes/testdata/recipetineats.html
T
dev_agentandClaude Opus 5.5 9e05d16a46
CI / ci (push) Successful in 1m35s
CI / ci (pull_request) Successful in 1m37s
Add schema.org Recipe JSON-LD extractor
recipes.Extract(page, url) scans a page's application/ld+json scripts and
og:site_name with a small targeted scanner (no new dependency) and returns
the single Recipe node: top level, top-level array or @graph, @type as a
string or array. It picks the largest image and resolves it against the
page URL, flattens HowToStep/HowToSection instructions in order, converts
ISO-8601 durations to minutes (total derived from prep + cook when absent),
and names the site from publisher, og:site_name or host. No Recipe is
ErrNoRecipe; two is ErrManyRecipes; shapes schema.org does not allow,
such as a "20 minutes" cookTime, are ErrMalformedRecipe.

testdata holds trimmed real pages from BBC Good Food, Budget Bytes,
RecipeTin Eats (HowToSection), King Arthur Baking, Delish (top-level
array), Food.com, Bon Appétit (non-ISO duration) and a Budget Bytes page
with no Recipe.

Maestro task 4c4570be-e0d2-43ad-90ea-0a4a9eeeb0b9.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 12:49:54 -04:00

12 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<!-- Trimmed from https://www.recipetineats.com/lasagna/ (fetched 2026-10-05): head metadata and JSON-LD only. -->
<html><head>
<title>Lasagna! - RecipeTin Eats</title>
<meta property="og:title" content="Lasagna!" />
<meta property="og:url" content="https://www.recipetineats.com/lasagna/" />
<meta property="og:site_name" content="RecipeTin Eats" />
<meta property="og:image" content="https://www.recipetineats.com/tachyon/2025/03/Lasagna_6-1.jpg" />
<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.recipetineats.com\/lasagna\/#article","isPartOf":{"@id":"https:\/\/www.recipetineats.com\/lasagna\/"},"author":{"name":"Nagi","@id":"https:\/\/www.recipetineats.com\/#\/schema\/person\/1684e6a75e9f91ae2e33ca2de95b47e2"},"headline":"Lasagna!","datePublished":"2017-05-19T05:00:00+00:00","dateModified":"2026-03-17T21:16:38+00:00","wordCount":2078,"commentCount":1029,"image":{"@id":"https:\/\/www.recipetineats.com\/lasagna\/#primaryimage"},"thumbnailUrl":"https:\/\/www.recipetineats.com\/tachyon\/2025\/03\/Lasagna_6-1.jpg","articleSection":["Beef mince recipes - ground beef","Beef Recipes","Casseroles and Cosy Bakes","Iconic Dishes","Italian Recipes","Pasta","Pasta bakes","Sunday Supper","Winter Warmers"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.recipetineats.com\/lasagna\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.recipetineats.com\/lasagna\/","url":"https:\/\/www.recipetineats.com\/lasagna\/","name":"Lasagna! - RecipeTin Eats","isPartOf":{"@id":"https:\/\/www.recipetineats.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.recipetineats.com\/lasagna\/#primaryimage"},"image":{"@id":"https:\/\/www.recipetineats.com\/lasagna\/#primaryimage"},"thumbnailUrl":"https:\/\/www.recipetineats.com\/tachyon\/2025\/03\/Lasagna_6-1.jpg","datePublished":"2017-05-19T05:00:00+00:00","dateModified":"2026-03-17T21:16:38+00:00","author":{"@id":"https:\/\/www.recipetineats.com\/#\/schema\/person\/1684e6a75e9f91ae2e33ca2de95b47e2"},"description":"One of the most beloved foods in the world, this is a traditional Italian Lasagna made with Bolognese ragu and cheese sauce. Recipe video and step photos included!","breadcrumb":{"@id":"https:\/\/www.recipetineats.com\/lasagna\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.recipetineats.com\/lasagna\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.recipetineats.com\/lasagna\/#primaryimage","url":"https:\/\/www.recipetineats.com\/tachyon\/2025\/03\/Lasagna_6-1.jpg","contentUrl":"https:\/\/www.recipetineats.com\/tachyon\/2025\/03\/Lasagna_6-1.jpg","width":1200,"height":1499},{"@type":"BreadcrumbList","@id":"https:\/\/www.recipetineats.com\/lasagna\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.recipetineats.com\/"},{"@type":"ListItem","position":2,"name":"Collections","item":"https:\/\/www.recipetineats.com\/category\/collections\/"},{"@type":"ListItem","position":3,"name":"Winter Warmers","item":"https:\/\/www.recipetineats.com\/category\/collections\/winter-recipe-collection\/"},{"@type":"ListItem","position":4,"name":"Lasagna!"}]},{"@type":"WebSite","@id":"https:\/\/www.recipetineats.com\/#website","url":"https:\/\/www.recipetineats.com\/","name":"RecipeTin Eats","description":"Fast Prep, Big Flavours","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.recipetineats.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.recipetineats.com\/#\/schema\/person\/1684e6a75e9f91ae2e33ca2de95b47e2","name":"Nagi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/75eae612677fdf550ba9a478ea595902153a0a06b8b27aaf6bc3eddcf6367244?s=96&d=https%3A%2F%2Fwww.recipetineats.com%2Ftachyon%2F2024%2F06%2Favatar-guest-temp-cache-bust-duplicate.png&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/75eae612677fdf550ba9a478ea595902153a0a06b8b27aaf6bc3eddcf6367244?s=96&d=https%3A%2F%2Fwww.recipetineats.com%2Ftachyon%2F2024%2F06%2Favatar-guest-temp-cache-bust-duplicate.png&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/75eae612677fdf550ba9a478ea595902153a0a06b8b27aaf6bc3eddcf6367244?s=96&d=https%3A%2F%2Fwww.recipetineats.com%2Ftachyon%2F2024%2F06%2Favatar-guest-temp-cache-bust-duplicate.png&r=g","caption":"Nagi"},"description":"I believe you can make great food with everyday ingredients even if you’re short on time and cost conscious. You just need to cook clever and get creative!","sameAs":["http:\/\/www.recipetineats.com\/about-me\/"],"url":"https:\/\/www.recipetineats.com\/author\/nagi-maehashigmail-com\/"},{"@type":"Recipe","name":"Lasagna","author":{"@id":"https:\/\/www.recipetineats.com\/#\/schema\/person\/1684e6a75e9f91ae2e33ca2de95b47e2"},"description":"Recipe video above. One of my signature recipes! This is a lasagna made the traditional Italian way, with a slow cooked ragu and a béchamel sauce (&quot;Besciamella&quot;). No ricotta - that&#39;s the American-Italian version. Though it requires patience to make, it is worth every minute. The ragu bolognese is melt-in-you-mouth tender and the sauce is rich and thick. Makes 8 giant or 10 normal servings. This lasagna has 4 layers of lasagna sheets with 3 layers of meat and cheese sauce, then finished with a cheese sauce topping. You could stretch it to 4 ragu layers. If making 5 layers, scale up the recipe by 25% (click on servings and slide) and use a very deep pan!","datePublished":"2017-05-19T16:00:00+00:00","image":["https:\/\/www.recipetineats.com\/tachyon\/2017\/05\/Lasagne-recipe-3-main-square.jpg","https:\/\/www.recipetineats.com\/tachyon\/2017\/05\/Lasagne-recipe-3-main-square.jpg?resize=500%2C500","https:\/\/www.recipetineats.com\/tachyon\/2017\/05\/Lasagne-recipe-3-main-square.jpg?resize=500%2C375","https:\/\/www.recipetineats.com\/tachyon\/2017\/05\/Lasagne-recipe-3-main-square.jpg?resize=480%2C270"],"recipeYield":["10"],"prepTime":"PT20M","cookTime":"PT240M","totalTime":"PT260M","recipeIngredient":["1 tbsp olive oil","1 onion (, finely chopped (white, yellow or brown))","1 medium carrot (, peeled and very finely diced)","1 celery stick (, very finely diced)","2 garlic cloves (, minced)","1 kg \/ 2 lb beef mince ((ground beef) (Note 1))","800g \/ 28 oz canned crushed tomato","1\/4 cup tomato paste","1 cup pinot noir red wine (, or other dry red wine (Note 2))","3 beef bouillon cubes (, crumbled)","2 bay leaves (, dried or fresh)","1\/2 tsp EACH dried thyme and oregano","2 tsp Worcestershire Sauce","1 - 2 tsp sugar ((if needed - Note 3))","1\/2 tsp salt and black pepper","60g \/ 4 tbsp butter","1\/2 cup flour","4 cups milk (, preferably full fat but low fat ok)","2 cups gruyere or Colby cheese (, shred yourself (or cheddar, Monterey Jack, OR 1 cup \/ 100g shredded parmesan) (Note 4))","Pinch of freshly ground nutmeg","Salt and pepper","350g\/ 12 oz fresh lasagna sheets ((or 250g\/8oz dried) (Note 5))","1 1\/2 cups (tightly packed) mozzarella cheese (, shred yourself (Note 4))","Finely chopped basil or parsley (, for garnish (optional))"],"recipeInstructions":[{"@type":"HowToSection","name":"Ragu:","itemListElement":[{"@type":"HowToStep","text":"Heat oil in a large heavy based pot over medium heat. Add garlic, onion, celery and carrots. Cook for 10 minutes until softened and sweet - they should not brown (if they do, turn heat down).","name":"Heat oil in a large heavy based pot over medium heat. Add garlic, onion, celery and carrots. Cook for 10 minutes until softened and sweet - they should not brown (if they do, turn heat down).","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-0-0"},{"@type":"HowToStep","text":"Add beef, turn heat up and cook the beef, breaking it up as you go.","name":"Add beef, turn heat up and cook the beef, breaking it up as you go.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-0-1"},{"@type":"HowToStep","text":"Once the beef has all turned brown, add the remaining Ragu ingredients EXCEPT the sugar.","name":"Once the beef has all turned brown, add the remaining Ragu ingredients EXCEPT the sugar.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-0-2"},{"@type":"HowToStep","text":"Stir then adjust the heat so it is bubbling very gently. Place the lid on and cook for 1.5 - 2 hours, stirring every now and then, then remove the lid and simmer for 30 minutes.","name":"Stir then adjust the heat so it is bubbling very gently. Place the lid on and cook for 1.5 - 2 hours, stirring every now and then, then remove the lid and simmer for 30 minutes.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-0-3"},{"@type":"HowToStep","text":"The ragu is ready when the meat is really tender and the sauce has thickened and is rich - see video for consistency (Note 6). Adjust salt and pepper to taste, and add sugar if required (Note 3)","name":"The ragu is ready when the meat is really tender and the sauce has thickened and is rich - see video for consistency (Note 6). Adjust salt and pepper to taste, and add sugar if required (Note 3)","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-0-4"}]},{"@type":"HowToSection","name":"Cheese Sauce:","itemListElement":[{"@type":"HowToStep","text":"Warm milk up in a saucepan (optional - just makes sauce thicken faster).","name":"Warm milk up in a saucepan (optional - just makes sauce thicken faster).","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-1-0"},{"@type":"HowToStep","text":"In a large saucepan, melt butter over medium low heat. Add flour and mix constantly for 1 minute.","name":"In a large saucepan, melt butter over medium low heat. Add flour and mix constantly for 1 minute.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-1-1"},{"@type":"HowToStep","text":"Pour about 1 cup of the milk in, mixing as you go to incorporate into the flour mixture. Once mostly lump free, add remaining milk. Use a whisk if needed to make it lump free.","name":"Pour about 1 cup of the milk in, mixing as you go to incorporate into the flour mixture. Once mostly lump free, add remaining milk. Use a whisk if needed to make it lump free.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-1-2"},{"@type":"HowToStep","text":"Turn heat up to medium high. Stir occasionally at first then regularly after a few minutes until sauce thickens - about 5 - 8 minutes. It should coat the back of the wooden spoon.","name":"Turn heat up to medium high. Stir occasionally at first then regularly after a few minutes until sauce thickens - about 5 - 8 minutes. It should coat the back of the wooden spoon.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-1-3"},{"@type":"HowToStep","text":"Remove from heat, add cheese, nutmeg, salt and pepper. Mix until the cheese is melted. The Sauce should be thick but still easily pourable - the consistency of heavy cream (you need to be able to drizzle it over the Ragu when layering - see video). If it's too thick, add a splash of water or milk.","name":"Remove from heat, add cheese, nutmeg, salt and pepper. Mix until the cheese is melted. The Sauce should be thick but still easily pourable - the consistency of heavy cream (you need to be able to drizzle it over the Ragu when layering - see video). If it's too thick, add a splash of water or milk.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-1-4"}]},{"@type":"HowToSection","name":"Assemble:","itemListElement":[{"@type":"HowToStep","text":"Preheat oven to 180°C\/350°F.","name":"Preheat oven to 180°C\/350°F.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-2-0"},{"@type":"HowToStep","text":"Use a 33 x 22 x 7 cm \/ 13 x 9 x 2.5\" baking dish.","name":"Use a 33 x 22 x 7 cm \/ 13 x 9 x 2.5\" baking dish.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-2-1"},{"@type":"HowToStep","text":"Smear a bit of Ragu on the base, then cover with lasagna sheets. Tear sheets to fit.","name":"Smear a bit of Ragu on the base, then cover with lasagna sheets. Tear sheets to fit.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-2-2"},{"@type":"HowToStep","text":"Spread over 2 1\/2 cups of Ragu (enough to cover sheets), then drizzle over 1 cup of Cheese Sauce.","name":"Spread over 2 1\/2 cups of Ragu (enough to cover sheets), then drizzle over 1 cup of Cheese Sauce.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-2-3"},{"@type":"HowToStep","text":"Top with lasagna sheets (Note 7). Spread with another 2 1\/2 cups of Ragu, then 1 cup of Cheese Sauce. Top with lasagna sheets then repeat 1 more time.","name":"Top with lasagna sheets (Note 7). Spread with another 2 1\/2 cups of Ragu, then 1 cup of Cheese Sauce. Top with lasagna sheets then repeat 1 more time.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-2-4"},{"@type":"HowToStep","text":"Top with a 4th layer of lasagna sheets, then pour over the remaining Cheese Sauce.","name":"Top with a 4th layer of lasagna sheets, then pour over the remaining Cheese Sauce.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-2-5"},{"@type":"HowToStep","text":"Sprinkle with Mozzarella, then bake for 25 minutes or until golden and bubbling.","name":"Sprinkle with Mozzarella, then bake for 25 minutes or until golden and bubbling.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-2-6"},{"@type":"HowToStep","text":"Stand for 5 to 10 minutes before cutting and serving, garnished with basil or parsley if desired.","name":"Stand for 5 to 10 minutes before cutting and serving, garnished with basil or parsley if desired.","url":"https:\/\/www.recipetineats.com\/lasagna\/#wprm-recipe-21417-step-2-7"}]}],"aggregateRating":{"@type":"AggregateRating","ratingValue":"4.93","ratingCount":"411","reviewCount":"8"},"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"4"},"reviewBody":"I cooked your amazing Lasagna recipe today. My husband and I thought it was the best I’ve done. It was so delicious, full of intense flavors.\r\nThank you Nagi.\r\nCheers,\r\nKate","author":{"@type":"Person","name":"Kate"},"datePublished":"2026-10-02"},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5"},"reviewBody":"Hello John. My point was simply that the ingredients I referred to would not be in a \"Traditional Lasgana\". I thought the recipe was otherwise very good. A perfectly constructive (&amp; polite) observation. Did you also send an abusive response to Veronika? I hope not. Interesting also that you can determine a person's heritage knowing nothing about them. Anyway, buona vita.","author":{"@type":"Person","name":"David"},"datePublished":"2026-09-11"},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5"},"reviewBody":"Love this recipe. I make it often and get so many compliments on it! Thank you 😊","author":{"@type":"Person","name":"Renee"},"datePublished":"2026-08-29"},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5"},"reviewBody":"Made this today! Yum. Didn't have red wine used 2 table spoons balsamic vinegar mix with remaining cup water instead. And added mushrooms to my soffrito. Was lovely and looks great! Sharing it with loved ones. Thanks Nagi!","author":{"@type":"Person","name":"Jo s"},"datePublished":"2026-08-18"},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5"},"reviewBody":"You can select at the top of the recipe Cups or Metric?","author":{"@type":"Person","name":"Jem"},"datePublished":"2026-08-17"},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5"},"reviewBody":"Thank you Nagi so so much for this absolutely delicious lasagna recipe. My first time making and it was sooo good, so moreish. I did broil to brown the topping for a couple of minutes towards the end. Divine 😋. Now adding to my family favourite list from Recipetineats recipes xx","author":{"@type":"Person","name":"MyTien Lazzarotto"},"datePublished":"2026-08-12"},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5"},"reviewBody":"This is my go to lasagna recipe! Soooo good 🤤","author":{"@type":"Person","name":"Tina"},"datePublished":"2026-08-09"},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":"5"},"reviewBody":"Delicious 😋 I've made a few lasagnes over 50 years and this one is the best 👌","author":{"@type":"Person","name":"Sylvia Tapper"},"datePublished":"2026-07-24"}],"recipeCategory":["Mains"],"recipeCuisine":["Italian","Western"],"keywords":"Lasagna","nutrition":{"@type":"NutritionInformation","servingSize":"398 g","calories":"594 kcal","carbohydrateContent":"40 g","proteinContent":"39 g","fatContent":"29 g","saturatedFatContent":"15 g","transFatContent":"1 g","cholesterolContent":"146 mg","sodiumContent":"979 mg","fiberContent":"2 g","sugarContent":"11 g","unsaturatedFatContent":"12 g"},"@id":"https:\/\/www.recipetineats.com\/lasagna\/#recipe","isPartOf":{"@id":"https:\/\/www.recipetineats.com\/lasagna\/#article"},"mainEntityOfPage":"https:\/\/www.recipetineats.com\/lasagna\/"}]}</script>
<script type="application/ld+json" class="wp-parsely-metadata">{"@context":"https:\/\/schema.org","@type":"NewsArticle","headline":"Lasagna!","url":"http:\/\/www.recipetineats.com\/lasagna\/","mainEntityOfPage":{"@type":"WebPage","@id":"http:\/\/www.recipetineats.com\/lasagna\/"},"thumbnailUrl":"https:\/\/www.recipetineats.com\/tachyon\/2025\/03\/Lasagna_6-1.jpg?resize=150%2C150","image":{"@type":"ImageObject","url":"https:\/\/www.recipetineats.com\/tachyon\/2025\/03\/Lasagna_6-1.jpg"},"articleSection":"Beef mince recipes - ground beef","author":[{"@type":"Person","name":"Nagi"}],"creator":["Nagi"],"publisher":{"@type":"Organization","name":"RecipeTin Eats","logo":"https:\/\/www.recipetineats.com\/tachyon\/2018\/12\/cropped-favicon%402x.png"},"keywords":["Collections","Winter Warmers","Beef mince recipes - ground beef","Beef Recipes","Casseroles and Cosy Bakes","Iconic Dishes","Italian Recipes","Pasta","Pasta bakes","Sunday Supper"],"dateCreated":"2017-05-19T05:00:00Z","datePublished":"2017-05-19T05:00:00Z","dateModified":"2026-03-17T21:16:38Z"}</script>
</head><body><main>(page body trimmed)</main></body></html>