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>
80 lines
5.4 KiB
HTML
80 lines
5.4 KiB
HTML
<!DOCTYPE html>
|
||
<!-- Trimmed from https://www.kingarthurbaking.com/recipes/classic-sandwich-bread-recipe (fetched 2026-10-05): head metadata and JSON-LD only. -->
|
||
<html><head>
|
||
<title>Classic Sandwich Bread Recipe | King Arthur Baking</title>
|
||
<meta property="og:site_name" content="King Arthur Baking" />
|
||
<meta property="og:url" content="https://www.kingarthurbaking.com/recipes/classic-sandwich-bread-recipe" />
|
||
<meta property="og:title" content="Classic Sandwich Bread" />
|
||
<meta property="og:image" content="https://www.kingarthurbaking.com/sites/default/files/2026-02/Classic-Sandwich-Bread-12.jpg" />
|
||
<script type="application/ld+json">{
|
||
"@context": "https://schema.org",
|
||
"@graph": [
|
||
{
|
||
"@type": "Recipe",
|
||
"keywords": "Sandwich bread;;Tangzhong",
|
||
"name": "Classic Sandwich Bread",
|
||
"description": "Made with all of the ingredients that make homemade white bread superior to storebought — butter, milk, and high-quality flour — this sandwich bread recipe is our version of a classic, perfected. The soft and tender interior makes this loaf ideal for sandwiches, toast, or even French toast. It\u0027s a timeless recipe you\u0027ll come back to time and time again.",
|
||
"recipeYield": [
|
||
"16",
|
||
"1 loaf"
|
||
],
|
||
"datePublished": "December 31, 2007 at 7:00pm",
|
||
"prepTime": "PT12M",
|
||
"cookTime": "PT40M",
|
||
"totalTime": "PT2H42M",
|
||
"recipeInstructions": [
|
||
"Weigh your flour; or measure it by gently spooning it into a cup, then sweeping off any excess.",
|
||
"In a large bowl, combine all of the ingredients. Mix and knead everything together — by hand, mixer, or bread machine set on the dough cycle — until you\u0027ve made a smooth dough. If you\u0027re kneading in a stand mixer, it should take 5 to 7 minutes at medium-low speed, and the dough should barely clean the sides of the bowl, perhaps sticking a bit at the bottom. In a bread machine (or by hand), knead the dough for about 6 to 8 minutes, until it forms a smooth ball. ",
|
||
"Transfer the dough to a lightly greased bowl, cover the bowl, and allow the dough to rise until puffy though not necessarily doubled in bulk, about 1 to 2 hours, depending on the warmth of your kitchen. If you\u0027re using a bread machine, allow the machine to complete its cycle, then leave the dough in the machine until it\u0027s doubled in bulk, perhaps an additional 30 minutes or so.",
|
||
"Gently deflate the dough and transfer it to a lightly oiled work surface. Shape the dough into an 8\u0022 log.",
|
||
"Place the log in a lightly greased 8 1/2\u0022 x 4 1/2\u0022 loaf pan, cover the pan loosely with lightly greased plastic wrap, and allow the bread to rise for about 60 minutes, until it\u0027s domed about 1\u0022 above the edge of the pan. A finger pressed into the dough should leave a mark that rebounds slowly. Towards the end of the rise, preheat your oven to 350°F.",
|
||
"Bake the bread for 30 to 35 minutes, until it\u0027s light golden brown. Test it for doneness by removing it from the pan and thumping it on the bottom (it should sound hollow), or by measuring its interior temperature with a digital thermometer (it should register 190°F at the center of the loaf).",
|
||
"Remove the bread from the oven, and cool it on a rack before slicing. Store the bread in a plastic bag at room temperature for several days; freeze for longer storage."
|
||
],
|
||
"recipeIngredient": [
|
||
"3 cups (360g) King Arthur Unbleached All-Purpose Flour",
|
||
"1/2 cup (113g) milk, (skim, 1%, 2% or whole, your choice)*",
|
||
"1/2 to 2/3 cup (113g to 152g) hot water, enough to make a soft, smooth dough* (see \u0022tips,\u0022 below)",
|
||
"4 tablespoons (57g) melted butter or 1/4 cup (50g) vegetable oil",
|
||
"2 tablespoons (25g) granulated sugar",
|
||
"1 1/4 teaspoons (8g) table salt",
|
||
"2 teaspoons instant yeast"
|
||
],
|
||
"publisher": {
|
||
"@type": "Organization",
|
||
"name": "King Arthur Baking",
|
||
"url": "https://www.kingarthurbaking.com/"
|
||
},
|
||
"author": {
|
||
"@type": "Person",
|
||
"name": "PJ Hamel",
|
||
"url": "https://www.kingarthurbaking.com/author/pj-hamel"
|
||
},
|
||
"image": {
|
||
"@type": "ImageObject",
|
||
"url": "https://www.kingarthurbaking.com/sites/default/files/2026-02/Classic-Sandwich-Bread-12.jpg"
|
||
},
|
||
"nutrition": {
|
||
"@type": "NutritionInformation",
|
||
"servingSize": "43g",
|
||
"calories": "120 calories",
|
||
"carbohydrateContent": "19g",
|
||
"cholesterolContent": "10mg",
|
||
"fiberContent": "1g",
|
||
"proteinContent": "3g",
|
||
"sodiumContent": "190mg",
|
||
"sugarContent": "2g",
|
||
"fatContent": "3g",
|
||
"saturatedFatContent": "2g",
|
||
"transFatContent": "0g"
|
||
},
|
||
"aggregateRating": {
|
||
"@type": "AggregateRating",
|
||
"ratingValue": "4.60",
|
||
"ratingCount": "681"
|
||
}
|
||
}
|
||
]
|
||
}</script>
|
||
</head><body><main>(page body trimmed)</main></body></html>
|