From 2960eff187481726f16cf3c3516ea7ac9e7783c9 Mon Sep 17 00:00:00 2001 From: jableader Date: Tue, 4 Nov 2025 18:31:13 +1100 Subject: [PATCH] scraping improvements --- recipes/__init__.py | 27 +- recipes/scraping.py | 912 +++- scripts/generate_expected_from_snapshots.py | 64 + scripts/manual_parse_recipes.py | 133 + scripts/recipe_urls.py | 37 + scripts/save_recipe_pages.py | 122 + tests/sample_files/recipes/README.md | 17 + .../recipes/cheese-omelette.recipe.json | 91 + ...ndkate.com-favorite-fried-eggs-recipe.html | 2249 +++++++++ ...e.com-favorite-fried-eggs-recipe.meta.json | 12 + ...com-favorite-fried-eggs-recipe.recipe.json | 48 + .../damndelicious.net-01-corn-salsa.meta.json | 12 + .../downshiftology.com-recipes-shakshuka.html | 2954 ++++++++++++ ...shiftology.com-recipes-shakshuka.meta.json | 12 + ...iftology.com-recipes-shakshuka.recipe.json | 178 + ...on-chicken-piccata-with-grilled-bread.html | 2397 +++++++++ ...icken-piccata-with-grilled-bread.meta.json | 12 + ...ken-piccata-with-grilled-bread.recipe.json | 144 + ...ction.com-triple-chocolate-layer-cake.html | 2521 ++++++++++ ....com-triple-chocolate-layer-cake.meta.json | 12 + ...om-triple-chocolate-layer-cake.recipe.json | 282 ++ ...-recipe-one-pot-garlic-parmesan-pasta.html | 193 + ...pe-one-pot-garlic-parmesan-pasta.meta.json | 12 + ...-one-pot-garlic-parmesan-pasta.recipe.json | 169 + ...food.com-recipes-chicken-tikka-masala.html | 516 ++ ...com-recipes-chicken-tikka-masala.meta.json | 12 + ...m-recipes-chicken-tikka-masala.recipe.json | 175 + ...taste.net-24412-cocoa-brownies-recipe.html | 1541 ++++++ ....net-24412-cocoa-brownies-recipe.meta.json | 12 + ...et-24412-cocoa-brownies-recipe.recipe.json | 1 + ...aking.com-recipes-banana-bread-recipe.html | 3365 +++++++++++++ ....com-recipes-banana-bread-recipe.meta.json | 12 + ...om-recipes-banana-bread-recipe.recipe.json | 199 + ...www.recipetineats.com-beef-stroganoff.html | 2673 ++++++++++ ...ecipetineats.com-beef-stroganoff.meta.json | 12 + ...ipetineats.com-beef-stroganoff.recipe.json | 178 + ...implyrecipes.com-recipes-french_toast.html | 4194 ++++++++++++++++ ...recipes.com-recipes-french_toast.meta.json | 12 + ...cipes.com-recipes-french_toast.recipe.json | 139 + ...recipes.com-recipes-perfect_guacamole.html | 4296 +++++++++++++++++ ...es.com-recipes-perfect_guacamole.meta.json | 12 + ....com-recipes-perfect_guacamole.recipe.json | 161 + ...0a83-1fa9-4e3e-b616-a995182613e0.meta.json | 12 + ...itchn.com-chicken-tamale-pie-23752740.html | 398 ++ ....com-chicken-tamale-pie-23752740.meta.json | 12 + ...om-chicken-tamale-pie-23752740.recipe.json | 211 + tests/test_recipes_offline_expected.py | 92 + ...t_recipes_parse_from_url_integration_v2.py | 6 + tests/test_recipes_parse_from_url_v2.py | 4 +- 49 files changed, 30628 insertions(+), 227 deletions(-) create mode 100644 scripts/generate_expected_from_snapshots.py create mode 100644 scripts/manual_parse_recipes.py create mode 100644 scripts/recipe_urls.py create mode 100644 scripts/save_recipe_pages.py create mode 100644 tests/sample_files/recipes/README.md create mode 100644 tests/sample_files/recipes/cheese-omelette.recipe.json create mode 100644 tests/sample_files/recipes/cookieandkate.com-favorite-fried-eggs-recipe.html create mode 100644 tests/sample_files/recipes/cookieandkate.com-favorite-fried-eggs-recipe.meta.json create mode 100644 tests/sample_files/recipes/cookieandkate.com-favorite-fried-eggs-recipe.recipe.json create mode 100644 tests/sample_files/recipes/damndelicious.net-01-corn-salsa.meta.json create mode 100644 tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.html create mode 100644 tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.meta.json create mode 100644 tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.recipe.json create mode 100644 tests/sample_files/recipes/pinchofyum.com-lemon-chicken-piccata-with-grilled-bread.html create mode 100644 tests/sample_files/recipes/pinchofyum.com-lemon-chicken-piccata-with-grilled-bread.meta.json create mode 100644 tests/sample_files/recipes/pinchofyum.com-lemon-chicken-piccata-with-grilled-bread.recipe.json create mode 100644 tests/sample_files/recipes/sallysbakingaddiction.com-triple-chocolate-layer-cake.html create mode 100644 tests/sample_files/recipes/sallysbakingaddiction.com-triple-chocolate-layer-cake.meta.json create mode 100644 tests/sample_files/recipes/sallysbakingaddiction.com-triple-chocolate-layer-cake.recipe.json create mode 100644 tests/sample_files/recipes/tasty.co-recipe-one-pot-garlic-parmesan-pasta.html create mode 100644 tests/sample_files/recipes/tasty.co-recipe-one-pot-garlic-parmesan-pasta.meta.json create mode 100644 tests/sample_files/recipes/tasty.co-recipe-one-pot-garlic-parmesan-pasta.recipe.json create mode 100644 tests/sample_files/recipes/www.bbcgoodfood.com-recipes-chicken-tikka-masala.html create mode 100644 tests/sample_files/recipes/www.bbcgoodfood.com-recipes-chicken-tikka-masala.meta.json create mode 100644 tests/sample_files/recipes/www.bbcgoodfood.com-recipes-chicken-tikka-masala.recipe.json create mode 100644 tests/sample_files/recipes/www.inspiredtaste.net-24412-cocoa-brownies-recipe.html create mode 100644 tests/sample_files/recipes/www.inspiredtaste.net-24412-cocoa-brownies-recipe.meta.json create mode 100644 tests/sample_files/recipes/www.inspiredtaste.net-24412-cocoa-brownies-recipe.recipe.json create mode 100644 tests/sample_files/recipes/www.kingarthurbaking.com-recipes-banana-bread-recipe.html create mode 100644 tests/sample_files/recipes/www.kingarthurbaking.com-recipes-banana-bread-recipe.meta.json create mode 100644 tests/sample_files/recipes/www.kingarthurbaking.com-recipes-banana-bread-recipe.recipe.json create mode 100644 tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.html create mode 100644 tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.meta.json create mode 100644 tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.recipe.json create mode 100644 tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.html create mode 100644 tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.meta.json create mode 100644 tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.recipe.json create mode 100644 tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.html create mode 100644 tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.meta.json create mode 100644 tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.recipe.json create mode 100644 tests/sample_files/recipes/www.taste.com.au-classic-chewy-brownie-f0960a83-1fa9-4e3e-b616-a995182613e0.meta.json create mode 100644 tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.html create mode 100644 tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.meta.json create mode 100644 tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.recipe.json create mode 100644 tests/test_recipes_offline_expected.py diff --git a/recipes/__init__.py b/recipes/__init__.py index 1d630fb..b8cfab1 100644 --- a/recipes/__init__.py +++ b/recipes/__init__.py @@ -23,16 +23,37 @@ from recipes.repository import ( load_recipe_ingredients as load_recipe_ingredients, row_to_recipe as row_to_recipe, ) -from recipes.scraping import scrape_recipe_ldata as _scrape_recipe_ldata +from recipes.scraping import ( + scrape_recipe_ldata as _scrape_recipe_ldata, + scrape_recipe_ldata_from_html as _scrape_recipe_ldata_from_html, +) -async def parse_recipe(conn, created_by, url: str) -> Optional[Recipe]: - ldata = await _scrape_recipe_ldata(url) +async def parse_recipe(conn, created_by, url: str, log=None, dump_dir: str | None = None) -> Optional[Recipe]: + """Parse a recipe from a URL. Returns None if parsing fails. + + Accepts an optional log callable taking a single string argument; when provided, + the scraper will emit diagnostic messages useful for manual testing. + """ + ldata = await _scrape_recipe_ldata(url, log=log, dump_dir=dump_dir) + if ldata: return await _get_recipe_from_ldata(conn, url, ldata, created_by) return None +async def parse_recipe_from_html(conn, created_by, base_url: str, html: str, log=None) -> Optional[Recipe]: + """Parse a recipe from raw HTML (offline). Returns None if parsing fails. + + This mirrors parse_recipe() but uses already-downloaded HTML via the offline + scraper entrypoint. Useful for tests/assertions against saved snapshots. + """ + ldata = _scrape_recipe_ldata_from_html(html, base_url, log=log) + if ldata: + return await _get_recipe_from_ldata(conn, base_url, ldata, created_by) + return None + + def find_yield(recipe_ldata: dict) -> int: if "recipeYield" in recipe_ldata: yield_vals = recipe_ldata["recipeYield"] diff --git a/recipes/scraping.py b/recipes/scraping.py index 632ce53..c67eca7 100644 --- a/recipes/scraping.py +++ b/recipes/scraping.py @@ -1,37 +1,275 @@ import json -from typing import Optional, Iterable, List +from typing import Optional, Iterable, List, Tuple, Dict import httpx from bs4 import BeautifulSoup +import html as _html -# A realistic browser header profile improves success rates against some CDNs/bot protections. +# POLICY: Strict ld+json-only recipe extraction +# --------------------------------------------- +# This scraper MUST NOT perform complex HTML-based ingredient parsing. +# Only two things are allowed when parsing HTML: +# 1) Discover additional, more-friendly variants of the same page (e.g., amp/print) +# 2) Locate and parse + + + + + + + + Favorite Fried Eggs Recipe - Cookie and Kate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Favorite Fried Eggs

Learn how to make the best fried eggs with this easy recipe! The trick is to cook them in hot olive oil so they develop irresistible lacy edges and flavor.

+
19 Reviews
63CommentsJump to recipe
+

crispy fried egg oozing under fork

+

Meet my favorite fried egg: the crispy olive oil fried egg. These fried eggs have golden, lacy, crispy edges, which contrast beautifully with their runny yellow yolks. Contrast is everything!

+

Start with a good egg, a hot skillet, and a generous drizzle of olive oil, and you’ll end up with the most flavorful fried egg you’ve ever tasted. They are infinitely better than the rubbery, sulfurous eggs that come out of non-stick skillets. In fact, these are the only fried eggs I ever want to eat.

+

egg in hot skillet with olive oil

+

I learned this technique several years ago from Phoebe Lapine via her YouTube video on fried eggs. Thanks, Phoebe! I’ve been cooking eggs this way ever since.

+

You’ve seen these crispy fried eggs on my recipes over the years, but I’m highlighting the technique today and offering all the tips and tricks I’ve learned. You’ll also get a look at my favorite recipes featuring these golden beauties.

+

Ready?!

+

+

Watch How to Fry An Egg

+ +
+ + + + + +
+ +

How to Make the Best Fried Egg

+

Tips and considerations to keep in mind:

+

Start with a great egg. I like to buy local eggs, which have the most beautiful golden yellow yolks. Free-range organic eggs are great, too.

+

Cook one or two eggs at a time. I usually just cook one egg at a time in a small skillet because sometimes the two eggs cross paths and stick together.

+

Use a cast iron skillet if you have one. Cast iron is non-toxic and retains heat well. If you warm up the pan as directed before adding the oil, it should offer a great non-stick cooking surface. I use my 8″ cast iron pan (affiliate link) for single eggs, or 12″ pan for two eggs. My next best bet would be stainless steel. I’m hesitant to suggest non-stick pans because high heat can damage the coatings and release toxic PFOA’s into the air.

+

Crack the egg into a bowl first. You can more easily avoid oil splatters this way. I also find that pouring from a bowl yields a more evenly shaped fried egg that cooks a little more evenly.

+

Make sure the oil is hot before you pour in the egg. This helps ensure that the egg doesn’t stick to the bottom of the pan, and yields super crispy edges.

+

Be careful and watch out for hot oil splatters! This recipe is going to leave some tiny oil splatters on your stovetop. You’ll want to step away after you pour in the egg to avoid getting splattered yourself.

+

A note on basting the egg white with oil: Most olive oil fried egg recipes suggest basting the egg white (not the yolk) with the hot olive oil while it cooks. You can do this by tilting the pan and scooping up some of the hot oil with a spoon. However, I can’t do this without burning my hand with oil splatters! My eggs turn out great without basting, so I didn’t include this in my recipe.

+

If you want more firm yolks: For medium eggs, just cook the egg for 30 to 60 more seconds. If you want more firm yolks than that, you can cover the egg for 30 seconds or longer while it cooks.

+

Repeat with additional eggs. You can continue frying eggs in the same skillet. Just add another drizzle of olive oil before each egg. You might need to dial down the heat as time goes on (if you catch the faintest whiff of smoke, it’s too hot).

+

Season as desired. These fried eggs are basically perfect right out of the skillet, but I love to sprinkle them with a little flaky sea salt and freshly ground black pepper. Serve them with a knife and a fork to cut through their crispy undersides!

+

how to fry an egg

+

my favorite fried eggs recipe (cooked in olive oil with crispy edges)

+ +Print
+ +
+
Save this recipe!
Get this recipe sent to your inbox, plus get new recipes from C+K every week!
+ + +

Favorite Fried Eggs

+ +
+
+
    +
  • Author: Cookie and Kate
  • +
  • Prep Time: 1 minute
  • +
  • Cook Time: 4 minutes
  • +
  • Total Time: 5 minutes
  • +
  • Yield: 1 fried egg
  • +
+
+ +
+

+ 5 Stars 4 Stars 3 Stars 2 Stars 1 Star 4.9 from 19 reviews

+
+
+ + +
+ Print +
+ +
+ +
+

Learn how to make the best fried eggs with this easy recipe! The trick is to cook them in hot olive oil so they develop irresistible lacy edges and lots of flavor. You can cook 1 to 2 eggs at a time in a skillet.

+
+ + +
+
+
+

Ingredients

+
+
+
+
    +
  • 1 tablespoon extra-virgin olive oil
  • +
  • 1 egg
  • +
+

+
+
+ +
+
+

Instructions

+
+
+
    +
  1. Cooking 1 egg? Pull out a small skillet, preferably cast iron. Cooking 2 eggs? Use a medium-to-large skillet and use 2 tablespoons of olive oil.
  2. +
  3. Crack an egg into a small bowl or ramekin and place it near the stove. Warm your skillet over medium-high heat until it’s hot enough that a drop of water sizzles rapidly on contact.
  4. +
  5. Reduce the heat to medium and add the olive oil to the pan. Gently tilt the pan around so the olive oil covers the base of the pan. The olive oil should be so warm that it shimmers on the pan (if not, give it a little more time to warm up).
  6. +
  7. Carefully pour the egg into the skillet and watch out for hot oil splatters (if you’re planning to add another egg to the same pan, pour it onto the side so there’s room for another).
  8. +
  9. Let the egg cook, gently tilting the pan occasionally to redistribute the oil, until the edges are crisp and golden and the yolk is cooked to your liking, about 2 minutes for runny yolks or 2 ½ to 3 minutes for medium yolks. (If you’re adding another egg to the skillet, go ahead and do it while the other is cooking.)
  10. +
  11. Transfer the cooked egg(s) to a plate. If you’d like to cook more eggs in the same skillet, add another drizzle of olive oil, leave the heat at medium (you might even need to dial it down a bit to avoid smoking) and add your next egg. Repeat as necessary.
  12. +
+
+
+ + +
+

Notes

+
+

Seasoning suggestions: I love a sprinkle of flaky sea salt, freshly ground black pepper, and sometimes a splash of hot sauce.

+
+
+ +
+

Nutrition

+
+

The information shown is an estimate provided by an online nutrition calculator. It should not be considered a substitute for a professional nutritionist’s advice. See our full nutrition disclosure here.

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

Recipes Featuring Crispy Fried Eggs

+

Simple and delicious breakfast/brunch recipes: avocado pesto toast with a fried egg! cookieandkate.com

+

Avocado Pesto Toast

+

“I wish I could attach a photo of how beautiful this came out. This breakfast is delicious! It’s easy to make, and the different flavors are incredible. I may never make pesto other than like this again! Even my insanely picky husband (who has never eaten an over easy egg in his life) loved It!” – Meghan

+

These homemade huevos rancheros are a hearty breakfast or dinner!

+

Fresh Huevos Rancheros

+

“I’ve just tried this recipe, the first time I have had huevos rancheros. Simply one of the greatest foods I have ever tasted. Thank you.” – Kate

+

DELICIOUS chilaquiles recipe with salsa verde instead of red sauce! This is a fantastic breakfast, brunch or dinner. cookieandkate.com

+

Chilaquiles Verdes with Baked Tortilla Chips

+

“SO good. Made this recipe for friends over the weekend. Took a shortcut and used pre-made salsa verde… since we were at a lake house and relaxing on a boat is more fun than chopping veggies… but still turned out great. Every one of your recipes that I have tried has been a huge success. Thanks!” – Emily

+

goat cheese polenta recipe

+

Goat Cheese Polenta with Roasted Vegetables

+

“I made this last week for dinner and hands down it is probably one of the best meals I’ve ever made/eaten! I loved all the flavors. The veggies I roasted were bell peppers, carrots, asparagus, brussels sprouts and red onion. My husband was a huge fan too. I’m definitely adding this to my rotation.” – Kayla

+

breakfast fajitas from love real food cookbook

+

Spicy Breakfast Fajitas with Fried Eggs and Guacamole

+

This recipe is available only in my cookbook, Love Real Food! If you haven’t tried it yet, you have really been missing out. One of my favorites, for sure!

+

Please let me know how you like your fried eggs in the comments! I really love hearing from you, and I hope this technique becomes your new favorite.

+ +
+ + + +
+ +
+ +
Kate and Cookie
+ + + +
+

HELLO, MY NAME IS

+ + + +

Kathryne Taylor

+ + + +

I'm a vegetable enthusiast, dog lover, mother and bestselling cookbook author. I've been sharing recipes here since 2010, and I'm always cooking something new in my Kansas City kitchen. Cook with me!

+ + + +
+ + + + +
Kate's signature
+
+
+ +
+ +
+ + + + + +

+ +
+

Leave a comment

Your comments make my day. Thank you! If you have a question, please skim the comments section—you might find an immediate answer there.
If you made the recipe, please choose a star rating, too.

+ Recipe rating + 5 Stars 4 Stars 3 Stars 2 Stars 1 Star
+

+ +

+ +

+

Comments

  1. +
    +
    +
    + Debra Transtrom
    + + + +
    + +
    +

    This technique works great in a heavy All-Clad fry pan also. Thought I’d try it before buying a cast iron skillet. The secret is in the preheating of the pan:-) And no, I don’t work for All-Clad haha.

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Thanks for sharing! I’m glad that pan works so well for you, Debra. Preheating is a key, I would agree!

      +
      + +
      +
    2. +
    +
  2. +
  3. +
    +
    +
    + Marina P B Coelho
    + + + +
    + +
    +

    Hi I don´t know if you are vegetarian because I follow so many cook blogs sometimes I can forget, but my favorite fried egg is basically the same as your recipe goes, but with lard instead… for me it beats the olive oil (which I also make at home pretty often and also like a lot)

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Yes, I am vegetarian. I’m glad you have a go-to egg recipe too! Of course, since I am vegetarian I prefer the taste olive oil provides. I appreciate you sharing, Marina!

      +
      + +
      +
    2. +
    +
  4. +
  5. +
    +
    +
    + Caryn
    + + + +
    + +
    +

    I have been loving eggs lately, so I will definitely be trying our your method. Quick question – There are so many people in the vegan/ vegetarian realm who say oil is so bad for you, what are your thoughts on oil for cooking/ dressings? I am so afraid of oil sometimes.

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Hi Caryn! Great question. My answer is it really depends on your dietary needs and the type of oil. The type of oil is important to be considered a healthier option. I prefer to stick with extra virgin olive oil, coconut oil and avocado oil (on occasion). There are several health benefits to good oils. Like being a healthy source for monounsaturated fat content, which supports heart health. Hope this helps some!

      +
      + +
      +
    2. +
    +
  6. +
  7. +
    +
    +
    + Peppermint Dolly
    + + + +
    + +
    +

    This is how I make a fried egg too – delicious every time!

    +

    Rebecca

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      That’s great, Rebecca!

      +
      + +
      +
    2. +
    +
  8. +
  9. +
    +
    +
    + Randi
    + + + +
    + +
    +

    My ten year old son made your fried egg recipe this morning. He’s a fried egg aficionado with a vegan mom so your recipe brought him hope that we might finally succeed with his breakfast. He LOVED it and declared that this will be his fried egg recipe from now on!

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Look at him! That’s awesome. I think it’s great your 10-year-old is cooking! Thanks for sharing, Randi.

      +
      + +
      +
    2. +
    +
  10. +
  11. +
    +
    +
    + Bruce Howell
    + + + +
    + +
    +

    Great recipe. I love a good fried egg with a runny yolk. Thank you for sharing.

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      You’re welcome, Bruce! Thanks for your review.

      +
      + +
      +
    2. +
    +
  12. +
  13. +
    +
    +
    + Gaby Dalkin
    + + + +
    + +
    +

    These eggs are brunch beauties!!

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      :)

      +
      + +
      +
    2. +
    +
  14. +
  15. +
    +
    +
    + OH LA LATKES
    + + + +
    + +
    +

    Oh wow, thank you for sharing these detailed instructions with us. This fried egg looks so scrumptious. Going to try this for breakfast tomorrow. <3

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      You’re welcome! Let me know what you think!

      +
      + +
      +
    2. +
    +
  16. +
  17. +
    +
    +
    + Tobie
    + + + +
    + +
    +

    This is kind of how my mom taught me to make fried eggs except she cooked them in browned butter and her skillet was a funky aluminum one. I now cook mine in my cast iron skillet that I bought as a young woman so they are well seasoned. And I also use butter but I will try olive oil sometime.

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Let me know what you think of the olive oil! I think you will be pleasantly surprised.

      +
      + +
      +
    2. +
    +
  18. +
  19. +
    +
    +
    + marge201
    + + + +
    + +
    +

    Oh, boy, does this look great! I used your link and put the 12″ pan in my cart. How about cleaning it? Just rinse and scrub with a thingie? There’s the seasoning thing, too, which I’ve read is best done with coconut oil. I will learn. Thank you!

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Great to hear, Marge! Just clean with water and something to get any food remaining. So yes, a thingie. :) I actually don’t season mine regularly. I find it works just to wash and then dry completely. Be sure to report back on what you think of the pan and recipe!

      +
      + +
      +
    2. +
    +
  20. +
  21. +
    +
    +
    + sheenam | thetwincookingproject.net
    + + + +
    + +
    +

    Amazing! These fried eggs look amazing. Thank you for sharing this.

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      You’re welcome!

      +
      + +
      +
    2. +
    +
  22. +
  23. +
    +
    +
    + Alexa | Doorstep Organics
    + + + +
    + +
    +

    There are so many ways of cooking eggs and this one is my favourite too, however, I don’t like it toasted and crispy. So I just lower the heat when cooking.

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      That works well too, Alexa! Thanks for sharing.

      +
      + +
      +
    2. +
    +
  24. +
  25. +
    +
    +
    + Beth
    + + + +
    + +
    +

    I never would have thought I wanted my eggs crunchy on the edges, but I was working from home today and decided to try for lunch. They are amazing! Thanks :)

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Right! The crunch adds some extra flavor. Thanks for try and sharing your experience, Beth!

      +
      + +
      +
    2. +
    +
  26. +
  27. +
    +
    +
    + Deb in Wales
    + + + +
    + +
    +

    I have never fried an egg in olive oil before, but after trying this I don’t want to use anything else! It gave me the tastiest, crispiest egg white edge ever, I cleared it, which is amazing because I don’t like egg white, only the yolk. No more fried eggs just to eat the yolk!

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Love to hear that, Deb! Yes, it does make for great tasting eggs. Thanks for your review!

      +
      + +
      +
    2. +
    +
  28. +
  29. +
    +
    +
    + Lisa
    + + + +
    + +
    +

    Mmmm! This is so delicious! I’m eating it right now with toast. Time for another one. Thank you!

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      You’re welcome Lisa! Thanks for your review.

      +
      + +
      +
    2. +
    +
  30. +
  31. +
    +
    +
    + Ali
    + + + +
    + +
    +

    I love fried eggs, but I can’t bring myself to love the runny yolk! Which means I tend to overcook them to get it more solid.

    +

    UGH I know – I’m a terrible foodie, LOL…. have you always liked the runny yolk?

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      It’s all about preferences! You aren’t a terrible foodie. I do enjoy it! Not sure when it started.

      +
      + +
      +
    2. +
    +
  32. +
  33. +
    +
    +
    + Carol-Ann Lamothe
    + + + +
    + +
    +

    Thank You Kate. I simply love making my morning egg this way, so much better. I can’t wait to try some of the above recipes, they look so yummy. Great work !!!

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Let me know what you think when you try them, Carol-Ann!

      +
      + +
      +
    2. +
    +
  34. +
  35. +
    +
    +
    + shelly Rathore
    + + + +
    + +
    +

    good jon.. nice blog..

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Thanks!

      +
      + +
      +
    2. +
    +
  36. +
  37. +
    +
    +
    + Katie Haahr
    + + + +
    + +
    +

    Hi Kate! I absolutely love this “recipe” and these step by step type posts on “basics” that you’ve been doing recently. They’re so incredibly helpful to me. I now make a version of your frittata each week and tried this method for fried eggs last night and they turned out perfectly. Thank you!

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      You’re welcome, Katie! I’m happy to hear that.

      +
      + +
      +
    2. +
    +
  38. +
  39. +
    +
    +
    + Bobguy
    + + + +
    + +
    +

    Great photos. I got up from the computer and cooked two eggs. Right this minute. Oops…I spilled a little egg yolk on the space bar. I only wish I had some cherry tomatoes in the fridge. The pesto recipe looks to good to pass up.

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Thanks for sharing!

      +
      + +
      +
    2. +
    +
  40. +
  41. +
    +
    +
    + Dani
    + + + +
    + +
    +

    I’ve always flipped my eggs when frying them. No flipping in this recipe? I just made them for breakfast and fought the urge to flip them but ended up doing so anyway because they just seemed totally raw on top. They’re delicious but I’m wondering if you can explain how the top gets cooked at all without flipping. Thanks, Kate!

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Hi Dani! Great question. It really matters that you are using the right pan and that you get your pan hot enough to begin with. Check out my tips! Preference on firmness is also up to you. Cook a little longer if you don’t like a runny egg. Hope this helps! See step 5 as well for direction on time to cook.

      +
      + +
      +
    2. +
    +
  42. +
  43. +
    +
    +
    + Katerina Hillios
    + + + +
    + +
    +

    Hi! Recipe looks amazing, but I need help!

    +

    Do your eggs ever bubble? When I make the switch from medium-high to high and drizzle the oil, I wait about 30 seconds to drop the egg. It sort of bubbles if the heat is too high, and if the heat is on medium, it doesn’t cook that well-just burns the edges. Btw-I’m using a regular pan, not a cast iron skillet.

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Interesting! What type of oil are you using? Is your stove gas or electric?

      +
      + +
      +
    2. +
    +
  44. +
  45. +
    +
    +
    + Lydia Moore
    + + + +
    + +
    +

    Hey Kate best fries egg recipe ever
    +Will defitnetly use it again – Lydia ☺

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      The best, great! Thanks for your comment and review, Lydia.

      +
      + +
      +
    2. +
    +
  46. +
  47. +
    +
    +
    + Amanda
    + + + +
    + +
    +

    Your blog is delicious!! I absolutely love reading it. Thank you!

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Thank you, Amanda!

      +
      + +
      +
    2. +
    +
  48. +
  49. +
    +
    +
    + Anna
    + + + +
    + +
    +

    This is how my mother always made fried eggs and although I have tried, have never been able to repeat

    +

    Olive oil and cast iron pan must be the secret. Thanks.

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      Thanks for sharing, Anna!

      +
      + +
      +
    2. +
    +
  50. +
  51. +
    +
    +
    + Kathy Wesserling
    + + + +
    + +
    +

    Personally, I think the perfectly cooked egg is how the person eating them loves them cooked. I happen to love mine with Crunchy and Runny, so your method should work beautifully for me. To those dissing this method, maybe the classical French way is not what many people like. I tell people “I won’t Yuk your Yum” if you don’t do mine.

    +
    + +
    +
  52. +
  53. +
    +
    +
    + Miley K
    + + + +
    + +
    +

    can i use canola oil instead of olive oil? pls let me know. Thanks

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      I don’t prefer canola oil, but it may work just fine.

      +
      + +
      +
        +
      1. +
        +
        +
        + Pawan
        + + + +
        + +
        +

        Thanks for letting me know of conola oil, I was not aware of this.

        +

        +
        + +
        +
      2. +
      +
    2. +
    +
  54. +
  55. +
    +
    +
    + Blue Jeans
    + + + +
    + +
    +

    Super easy, I really loved making fried eggs. I made it two days in a row. I will continue to make them now that I know how to make them. Thanks a lot.

    +

    +
    + +
    +
  56. +
  57. +
    +
    +
    + Kelly
    + + + +
    + +
    +

    Wonderful fried eggs. They turned out absolutely perfect and my boyfriend practically did cartwheels! The cast iron pan is the secret and hot oil.
    +I’ll definitely be watching your website for more handy tips and recipes.
    +Thank you!

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      You’re welcome, Kelly! Thank you for commenting.

      +
      + +
      +
    2. +
    +
  58. +
  59. +
    +
    +
    + Kari
    + + + +
    + +
    +

    Excellent.

    +

    +
    + +
    +
  60. +
  61. +
    +
    +
    + Kate Mc
    + + + +
    + +
    +

    My grandmother Ellie calls these eggs with “lacy underpants”
    +❤️

    +
    + +
    +
  62. +
  63. +
    +
    +
    + Ethelyn Dietrich
    + + + +
    + +
    +

    This recipe collection comes at a wonderful time, Honestly, I can eat eggs any time of the day! Your compilation gives me lots of new ideas! I especially love Crispy Fried Eggs that The taste is very unique.

    +
    + +
    +
  64. +
  65. +
    +
    +
    + Christine
    + + + +
    + +
    +

    Loved this fried egg recipe! I’ve been wanting to make eggs in my cast iron skillet but I’ve see so many people say their not good for eggs?? I thought, really? My Ggrandma always did. So I hesitated till I found your recipe!!!
    +super easy & quick

    +

    +
    + +
    +
      +
    1. +
      +
      +
      + Kate
      + + + +
      + +
      +

      I’m glad you loved it, Christie! I appreciate your review.

      +
      + +
      +
    2. +
    +
  66. +
  67. +
    +
    +
    + Barbara
    + + + +
    + +
    +

    This is exactly how I prefer to eat eggs! Until now I have separated the yolk out to fry the white until the edges are crispy, adding the yolk at the last minute so as to leave it runny. Tomorrow morning I will try your method – I have great hopes!

    +
    + +
    +
  68. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/sample_files/recipes/cookieandkate.com-favorite-fried-eggs-recipe.meta.json b/tests/sample_files/recipes/cookieandkate.com-favorite-fried-eggs-recipe.meta.json new file mode 100644 index 0000000..e326922 --- /dev/null +++ b/tests/sample_files/recipes/cookieandkate.com-favorite-fried-eggs-recipe.meta.json @@ -0,0 +1,12 @@ +{ + "url": "https://cookieandkate.com/favorite-fried-eggs-recipe/", + "fetched_at": "2025-11-04T07:23:56.579020+00:00", + "status": 200, + "final_url": "https://cookieandkate.com/favorite-fried-eggs-recipe/", + "error": null, + "profile": "automation", + "content_type": "text/html; charset=UTF-8", + "content_encoding": "gzip", + "candidate": "https://cookieandkate.com/favorite-fried-eggs-recipe/", + "request_headers": "{\"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"en-US,en;q=0.8\", \"Accept-Encoding\": \"gzip, deflate\", \"Connection\": \"keep-alive\", \"User-Agent\": \"MunchEaseRecipeBot/1.0 (+https://example.com/bot)\", \"From\": \"bot@example.com\"}" +} \ No newline at end of file diff --git a/tests/sample_files/recipes/cookieandkate.com-favorite-fried-eggs-recipe.recipe.json b/tests/sample_files/recipes/cookieandkate.com-favorite-fried-eggs-recipe.recipe.json new file mode 100644 index 0000000..0a20431 --- /dev/null +++ b/tests/sample_files/recipes/cookieandkate.com-favorite-fried-eggs-recipe.recipe.json @@ -0,0 +1,48 @@ +{ + "id": -1, + "name": "Favorite Fried Eggs", + "link": "https://cookieandkate.com/favorite-fried-eggs-recipe/", + "serves": 1, + "imageUrls": [ + "https://cookieandkate.com/images/2018/09/crispy-fried-egg-recipe-225x225.jpg", + "https://cookieandkate.com/images/2018/09/crispy-fried-egg-recipe-260x195.jpg", + "https://cookieandkate.com/images/2018/09/crispy-fried-egg-recipe-320x180.jpg", + "https://cookieandkate.com/images/2018/09/crispy-fried-egg-recipe.jpg" + ], + "ingredients": [ + { + "id": -1, + "name": "extra-virgin olive oil", + "line": "1 tablespoon extra-virgin olive oil", + "unit": "Tablespoon", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "egg", + "line": "1 egg", + "unit": "Items", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + } + ], + "basedOnRecipe": null, + "dateCreated": "2025-11-04T18:24:29.367540+11:00", + "createdById": 1, + "createdBy": { + "id": 1, + "displayName": "Snapshot Generator" + }, + "dateHidden": null, + "hiddenById": null, + "hiddenBy": null +} \ No newline at end of file diff --git a/tests/sample_files/recipes/damndelicious.net-01-corn-salsa.meta.json b/tests/sample_files/recipes/damndelicious.net-01-corn-salsa.meta.json new file mode 100644 index 0000000..1cd5a00 --- /dev/null +++ b/tests/sample_files/recipes/damndelicious.net-01-corn-salsa.meta.json @@ -0,0 +1,12 @@ +{ + "url": "https://damndelicious.net/2025/08/01/corn-salsa/", + "fetched_at": "2025-11-04T07:23:56.680123+00:00", + "status": 403, + "final_url": "https://damndelicious.net/2025/08/01/corn-salsa/amp", + "error": null, + "profile": "edge-desktop", + "content_type": "text/html; charset=UTF-8", + "content_encoding": "gzip", + "candidate": "http://damndelicious.net/2025/08/01/corn-salsa/amp", + "request_headers": "{\"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"en-US,en;q=0.8\", \"Accept-Encoding\": \"gzip, deflate\", \"Connection\": \"keep-alive\", \"Upgrade-Insecure-Requests\": \"1\", \"Sec-Fetch-Dest\": \"document\", \"Sec-Fetch-Mode\": \"navigate\", \"Sec-Fetch-Site\": \"none\", \"Sec-Fetch-User\": \"?1\", \"sec-ch-ua\": \"\\\"Chromium\\\";v=\\\"127\\\", \\\"Not=A?Brand\\\";v=\\\"24\\\", \\\"Microsoft Edge\\\";v=\\\"127\\\"\", \"sec-ch-ua-mobile\": \"?0\", \"sec-ch-ua-platform\": \"\\\"Linux\\\"\", \"User-Agent\": \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0\", \"Referer\": \"http://damndelicious.net/\"}" +} \ No newline at end of file diff --git a/tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.html b/tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.html new file mode 100644 index 0000000..703f726 --- /dev/null +++ b/tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.html @@ -0,0 +1,2954 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Best Shakshuka Recipe (Easy & Traditional) | Downshiftology + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Shakshuka

Read 996 Comments

This post may contain affiliate links. See my disclosure policy.

+
Serves 6 servings
Prep Time 10 minutes
Cook Time 20 minutes
Jump to Recipe
+

Shakshuka is an easy, healthy meal in Israel and other parts of the Middle East and North Africa. It’s a simple combination of simmering tomatoes, onions, garlic, spices and gently poached eggs. It’s nourishing, filling and one recipe I guarantee you’ll make time and again.

+ + + +
Shakshuka in a saute pan.
+ + + +

The first time I had shakshuka was years ago on a trip to Egypt with my mom. I remember instantly loving the meal and the simple yet bold flavors and spices. So when I recently visited Israel and Jordan, where shakshuka is almost a national dish, it was the meal I was most eager to dive into, once again.

+ + + +

I spent two weeks traveling throughout Israel and Jordan (on the most glorious trip) and was able to enjoy shakshuka many times over. To be honest, I considered it “research” so that I could bring you the most authentic rendition.

+ + + +

What is Shakshuka?

+ + + +

Shakshuka is a classic North African and Middle Eastern dish and one that’s eaten for breakfast or any meal of the day. It’s made from simple, healthy ingredients and is vegetarian. Shakshuka literally means “a mixture” and the traditional version uses tomatoes, onions and spices as the base with eggs poached on top.

+ + + +

Today, you can find many variations of shakshuka, like my Green Shakshuka with Brussels Sprouts and Spinach and Orange Shakshuka with Butternut Squash. You can also add feta or goat cheese and adapt it to your taste. The options are endless – which is what makes this dish such a national favorite (of so many countries!).

+ + + +
Close up photo of shakshuka in a pan.
+ + + +

Shakshuka Ingredients

+ + + +
    +
  • Vegetables: The base of shakshuka is a mix of sauteed onion, bell pepper, and garlic, along with tomatoes (I use a can of whole peeled tomatoes).
  • + + + +
  • Spices: The simple combination of paprika, cumin, and chili powder imparts incredible flavor. And the aroma instantly takes me back to meandering the spice souks in Cairo and Amman.
  • + + + +
  • Eggs: The eggs gently poach in the spiced tomato mixture. You can cook them as long as you’d like for your perfect yolk texture. I personally prefer my yolks a bit runny.
  • + + + +
  • Fresh Herbs: A sprinkle of freshly chopped parsley and cilantro not only adds a pop of green, but also adds yet another layer of flavor.
  • +
+ + + +
Taking a portion of shakshuka out of the pan.
+ + + +

How to Make Shakshuka

+ + + +

It’s really easy to make shakshuka, especially if you use canned tomatoes (though you can always use fresh tomatoes as well – see my tip below).

+ + + +

Saute the veggies. Dice an onion and red bell pepper and add that to a sauté pan with a little olive oil over medium heat. Stir the veggies for about 5 minutes, or until the onions become translucent. Then add the garlic and spices and stir for another minute, until the mixture is nice and fragrant.

+ + + +
Sauteing onion and bell pepper in a pan.
+ + + +

Simmer the eggs on top. Pour in a 28-ounce can of whole peeled tomatoes and use your spatula to break up the tomatoes into smaller pieces. Once this entire mixture is lightly simmering, you can crack your eggs on top. Use your spatula to make little holes for the eggs, then crack an egg into each hole. I use six eggs, though depending on the size of your pan you may use more or less. Reduce the heat to low, and cook for another 5 to 8 minutes or until the eggs are done to your liking.

+ + + +
Eggs poaching in spiced tomato mixture.
+ + + +

Garnish with fresh herbs. Before serving, season the eggs with salt and a generous amount of freshly chopped parsley and cilantro. Enjoy!

+ + + +
Shakshuka in a pan.
+ + + +

Common Questions

+ + + +
Is shakshuka spicy?

Shakshuka spices may vary, but you’ll commonly find paprika, cumin and chili powder, along with fresh garlic. I’d consider it flavorful spicy, not hot spicy. Though you can always add cayenne pepper if you’d like to heat it up.

How do I prevent runny egg whites?

The eggs should cook fully after simmering for 5 to 8 minutes in the pan. But if you’d like to speed up the process, go ahead and add a lid. They’ll cook in about half the time.

Can I swap in fresh tomatoes for the canned tomatoes?

Yes, you sure can. I’m using whole peeled tomatoes which break down easily into a soft texture (as there’s no skin). But you can use diced fresh tomatoes as well. If using fresh, you’ll need about 10 to 12 tomatoes.

+ + + +
A single serving of shakshuka on a plate.
+ + + +

Shakshuka is abundant in tel aviv

+ + + +

Tel Aviv is a bustling, vibrant, hip, outdoor cafe-vibe kind of city. I didn’t know what to expect with Tel Aviv, but I can tell you this, it blew me away. There’s a youthful energy to the city and I encountered some of the friendliest, most hospitable people.

+ + + +

There’s gorgeous Mediterranean weather year round in Tel Aviv, but let me tell you, the food scene is definitely something to write home about. I ate. And ate. And ate. Everything is fresh, veggie-heavy, loaded with herbs and layered with flavor. It’s a dream city for vegetarians and those who just like phenomenal food.

+ + + +

The photo below is one shakshuka I enjoyed in Tel Aviv. How adorable is that single-serving portion served up in a mini sauté pan? Shakshuka with freshly squeezed juice and a side of fruit, yes please!

+ + + +
+ + + +

What To Serve With Shakshuka

+ + + +

It’s quite common to serve pita or some type of bread with shakshuka. You can dip it in the sauce to soak it all up! I was fortunate in Tel Aviv to find several restaurants that served gluten-free pita, much to my delight! But here are a few other ideas:

+ + + + + + + +

More Healthy Breakfast Recipes

+ + + + + + + +

I hope you enjoy this authentic shakshuka recipe from my travels to Egypt, Israel, and Jordan. If you make it, let me know how it turned out. I’d love to hear what you think in the comments below.

+ + +
+
Shakshuka in a pan with fresh herbs on top.
+ +
+
+

Shakshuka Recipe (Easy & Traditional)

+
Author: Lisa Bryan
+
+
4.94 from 492 votes
+ + + Read 996 Comments + +
+
+
+
+ +
Serves 6 servings
Prep Time 10 minutes
Cook Time 20 minutes
Total Time 30 minutes
+
+ +
+
+
Email This Recipe
Enter your email and I’ll send it to you + weekly food inspiration!
+
+
+ +

Description

+
Shakshuka is a North African and Middle Eastern meal of poached eggs in a simmering tomato sauce with spices. It's easy, healthy and takes less than 30 minutes to make. Watch the video below to see how I make it in my kitchen!
+

Video

+

Equipment

+

Ingredients 
 

  • 2 tablespoons olive oil
  • 1 medium onion, diced
  • 1 red bell pepper, seeded and diced
  • 4 garlic cloves, finely chopped
  • 2 teaspoon paprika
  • 1 teaspoon cumin
  • ¼ teaspoon chili powder
  • 1 (28-ounce can) whole peeled tomatoes
  • 6 large eggs
  • salt and pepper, to taste
  • 1 small bunch fresh cilantro, chopped
  • 1 small bunch fresh parsley, chopped
+

Instructions 

  • Heat olive oil in a large sauté pan on medium heat. Add the chopped bell pepper and onion and cook for 5 minutes or until the onion becomes translucent.
  • Add garlic and spices and cook an additional minute.
  • Pour the can of tomatoes and juice into the pan and break down the tomatoes using a large spoon. Season with salt and pepper and bring the sauce to a simmer.
  • Use your large spoon to make small wells in the sauce and crack the eggs into each well. Cook the eggs for 5 to 8 minutes, or until the eggs are done to your liking. You can also cover the pan with a lid to expedite the eggs cooking.
  • Garnish with chopped cilantro and parsley before serving.
+

Lisa’s Tips

    +
  • If you’re not dairy-free, crumbled feta or goat cheese on top is delicious addition. Traditionally it’s also served with pita, but I love to serve it with slices of avocado.
  • +
  • Many photos online show shakshuka cooked in a cast iron pan. Tomatoes are acidic and may erode the seasoning on your cast iron pan as well as dull the finish. You may also get a slight metallic flavor to the dish. So I recommend not taking any chances and cooking it in a stainless steel pan, like this beauty from All Clad.
  • +
+
+

Nutrition

Calories: 146kcal | Carbohydrates: 10g | Protein: 7g | Fat: 9g | Saturated Fat: 2g | Polyunsaturated Fat: 1g | Monounsaturated Fat: 5g | Trans Fat: 1g | Cholesterol: 164mg | Sodium: 256mg | Potassium: 409mg | Fiber: 2g | Sugar: 5g | Vitamin A: 1371IU | Vitamin C: 40mg | Calcium: 80mg | Iron: 3mg
+
+ +
+
Did you make this recipe?Mention @downshiftology or tag #downshiftology!
+ + +

Recipe originally posted December 2018, but updated to include new photos, video, and information for your benefit!

+
+
+
+

You May Also Like

+
+
+
+ + + + +
+
+

About the author

+
+
+
+

Lisa Bryan

+

Lisa is a bestselling cookbook author, recipe developer, and YouTuber (with over 2.5 million subscribers) living in sunny Southern California. She started Downshiftology in 2014, and is passionate about making healthy food with fresh, simple and seasonal ingredients.

+ + +
+
+
+
+
+ 4.94 from 492 votes (91 ratings without comment) +
+
+
+

Leave a comment

Thank you for taking the time to write a review—I always love reading your comments.

Your email address will not be published. Required fields are marked *

+ +
+ Did you make this? Rate the recipe! +




+
+
+

+ +

+ +

All comments are moderated before appearing on the site, as per the community guidelines. Thank you for your patience! Please note that anonymous star reviews without comments are not allowed on Downshiftology, to ensure the integrity of recipe reviews.

+

996 Comments

  1. + +
  2. +
  3. + +
  4. +
  5. + +
  6. +
  7. + +
      +
    1. + +
    2. +
    +
  8. +
  9. +
    + + +
    +

    This is now my go-to shakshuka recipe! It comes together so quickly and it tastes amazing every time. Thank you!5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  10. +
  11. +
    + + +
    +

    Amazing recipe! Very delicious. I’m sure your travels to Palestine and Jordan must’ve been beautiful. My family enjoyed this dish thoroughly and the measurements were perfect :)5 stars

    +
    + +
    +
      +
    1. +
      + + +
      +

      They were definitely life-changing trips! Happy to hear you and your family loved this shakshuka recipe, Sumi.

      +
      + +
      +
    2. +
    +
  12. +
  13. +
    + + +
    +

    Hi Lisa! Just made this for my husband and I for dinner and we absolutely loved it. Thank you so much for the wonderful recipe and inspiration to try new things!! I can hardly wait for my daughter to get home to try it. She’s the adventurous cook in our family and I’m betting she loves it!5 stars

    +
    + +
    +
      +
    1. +
      + + +
      +

      Happy to hear you both loved this shakshuka recipe, Maureen! I hope your daughter loves it too!

      +
      + +
      +
    2. +
    +
  14. +
  15. +
    + + +
    +

    Made this recipe so many times. It’s simply delicious and so easy to make. I didn’t use bell peppers. Sometimes I add chickpeas or black beans.5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  16. +
  17. +
    + + +
    +

    Have made this recipe a couple of times now, so easy and delicious! Really adaptable as well, this time around I chucked in some white beans that I had left over in the fridge for an extra protein boost and served over crispy potatoes (also left over). So yum5 stars

    +
    + +
    +
      +
    1. +
      + + +
      +

      Love the way you tweaked this recipe to make it your own with the white beans and potatoes! Sounds delicious, Danny.

      +
      + +
      +
    2. +
    3. + +
        +
      1. + +
      2. +
      +
    4. +
    +
  18. +
  19. + +
      +
    1. + +
    2. +
    +
  20. +
  21. +
    + + +
    +

    Thank you for sharing the Recipe. I’ve just made a very good Shakshuka for my guest and they love it ❤️5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  22. +
  23. +
    + + +
    +

    This shakshuka is the best! My husband and I eat it over toast at least once a week. It has the perfect balance of flavor. There’s no need to alter the recipe at all.5 stars

    +
    + +
    +
      +
    1. +
      + + +
      +

      I’m so glad this shakshuka dish has become a regular part of your breakfast routine now, Jill!

      +
      + +
      +
    2. +
    +
  24. +
  25. +
    + + +
    +

    Made this a couple of months ago and yummo. Just the right level of seasoning and wow flavortown express.5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    3. + +
        +
      1. + +
      2. +
      +
    4. +
    +
  26. +
  27. +
    + + +
    +

    The whole family loved it! I went heavier on the spices, added some curry power and simmered the sauce down a bit before adding the eggs. Nutritious, healthy and satisfying breakfast!5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  28. +
  29. +
    + + +
    +

    I really enjoyed reading this. Shakshuka is one of my favorite meals too, so simple but full of flavor. I once checked SheMed’s blogs for some healthy recipe ideas and it reminded me how easy meals like this can also be so nourishing. Definitely going to try your version at home!

    +
    + +
    +
      +
    1. + +
    2. +
    +
  30. +
  31. + +
      +
    1. + +
    2. +
    +
  32. +
  33. +
    + + +
    +

    Yum Yum! And so easy! I have no excuse not to make this like monthly! I was out of whole tomatoes so I used large can of Diced – came out great!5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  34. +
  35. +
    + + +
    +

    I make this for guests because of how easy and delicious it is every time!! Sooo good and comforting5 stars

    +
    + +
    +
      +
    1. +
      + + +
      +

      Yes, it’s a great recipe for family, friends, and other guests. So happy you love it!

      +
      + +
      +
    2. +
    +
  36. +
  37. +
    + + +
    +

    I love this recipe! Ive done multiple times and its always a hit with house guests when I cook for breakfast. I will have to try next time with the falafel :D5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  38. +
  39. +
    + + +
    +

    Cilantro, like avocado is way over used. I’d use baby spinach for “a flash of green”

    +
    + +
    +
  40. +
  41. + +
      +
    1. + +
    2. +
    +
  42. +
  43. +
    + + +
    +

    I love this recipe i serve with a sour dough bread or toast.Every one loves it.5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  44. +
  45. +
    + + +
    +

    My husband is the default chef in our household, but I consider this recipe one of my signature dishes! Since I didn’t really learn how to cook growing up, this recipe is simple enough for me to make to perfection every time! I’ve fed this meal to guests many times, and they tell me weeks later that they’ve still been thinking about it because it was just so delicious. I highly recommend this recipe. It takes some staple ingredients and turns them into a delicious and nutritious meal!5 stars

    +
    + +
    +
      +
    1. +
      + + +
      +

      Thrilled to hear this shakshuka has become a signature dish, Leah!

      +
      + +
      +
    2. +
    +
  46. +
  47. +
    + + +
    +

    Third time making this and second time adding sweet baby spinach. Such a versatile meal. Having this this evening for dinner. Thanks. We love it.5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  48. +
  49. +
    + + +
    +

    For the shakshuka, I don’t like chunks of tomato. Could I use a tomato sauce?

    +
    + +
    +
      +
    1. + +
    2. +
    +
  50. +
  51. +
    + + +
    +

    I’ve made this a few times as written and it is absolutely delicious. But with so many beautiful fresh tomatoes in my kitchen right now, I wanted to try a couple things, just to see if it made any difference. So instead of canned tomatoes, I used a mix of chopped heirlooms and some Romas. I also used Aleppo pepper in place of regular chili powder because it’s wonderful in your Turkish eggs recipe and other middle eastern dishes. I also added a tablespoon of tomato paste after the garlic. I don’t know why, it just seemed like a good idea at the time. You’re right that using fresh tomatoes added a fair amount of time to the cooking process – it took a good 25 minutes for the tomatoes to break down, but it was so worth it. I did another weird thing. At the very end before I added the eggs, I threw in some cubed day-old crusty bread I made, and it was a fun added texture. Plus it helped with the added juices from the fresh tomatoes. I’ll happily go back to canned tomatoes in the fall, but I really loved using fresh tomatoes while I can. Your shakshuka is a favorite in our house!5 stars

    +
    + +
    +
      +
    1. +
      + + +
      +

      Thanks for sharing your experimental experiences with this recipe, Mitzi! The Aleppo pepper is a great idea for adding a flavorful touch as well.

      +
      + +
      +
    2. +
    3. +
      + + +
      +

      I have lots of garden tomatoes in my yard too. When you made it with fresh tomatoes, did you remove the skins first?

      +
      + +
      +
    4. +
    +
  52. +
  53. +
    + + +
    +

    This is my second time making shakshuka. I burned the tomatoes the first time but made it right this time around. Also added roasted eggplant with curry on top. Delicious!5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  54. +
  55. +
    + + +
    +

    Just made this for breakfast for hubby and me – added some fried up kale at the end, and sprinkled a bit of feta on top. Absolutely delicious! Will definitely add this Israeli/North African dish to our weekends! I might try with smoked paprika next time. Thanks for the recipe :)5 stars

    +
    + +
    +
      +
    1. + +
    2. +
    +
  56. +
  57. +
    + + +
    +

    Cannot wait to make this. Much easier than I thought it would be.

    +

    Can I use smoked paprika instead of regular?

    +
    + +
    +
      +
    1. +
      + + +
      +

      Hi Sandie – yes, you can use whichever paprika you prefer. Enjoy!

      +
      + +
      +
    2. +
    +
  58. +
  59. + +
      +
    1. + +
    2. +
    +
  60. +
  61. +
    + + +
    +

    Hi! So excited to try this! May I ask: why whole tomatoes? Would using a can of crushed work just as well and save you having to break them up? Thanks!

    +
    + +
    +
  62. +
  63. + +
      +
    1. +
      + + +
      +

      Hi Tamera – You can freeze the sauce, but without the eggs as poached eggs do not freeze well.

      +
      + +
      +
    2. +
    +
  64. +
  65. + +
  66. +
  67. +
    + + +
    +

    Omggggg so good. I’ve been wanting to try this one for awhile and I finally did! So obsessed and 2/3 of my kids like it too which is a huge win. Such a great easy recipe for any meal. Thanks Lisa!5 stars

    +
    + +
    +
      +
    1. +
      + + +
      +

      Glad you finally got around to trying this shakshuka recipe, Katie. Enjoy!

      +
      + +
      +
    2. +
    3. +
      + + +
      +

      I am going to make this for the first time. I’m trying to see what is the best side to put with it because it had so much juice in it. If anyone.
      +Can give me some ideas of what to put it on the side. I would appreciated it.

      +
      + +
      +
        +
      1. +
        + + +
        +

        Hi Shawna, in the tips after the recipe it mentioned pita bread. Most breads would probably work.

        +
        + +
        +
      2. +
      +
    4. +
    5. +
      + + +
      +

      This dish originated in Tunisia, not Israel. It’s also very loved and enjoyed by Palestinians in North Africa and the Middle East.5 stars

      +
      + +
      +
        +
      1. +
        + + +
        +

        Just cook the awesome food and keep your politics to yourself.

        +

        Lisa literally wrote, “Shakshuka is an easy, healthy meal in Israel AND other parts of the Middle East and North Africa”.

        +
        + +
        +
      2. +
      +
    6. +
    +
  68. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.meta.json b/tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.meta.json new file mode 100644 index 0000000..895d623 --- /dev/null +++ b/tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.meta.json @@ -0,0 +1,12 @@ +{ + "url": "https://downshiftology.com/recipes/shakshuka/", + "fetched_at": "2025-11-04T07:23:56.673481+00:00", + "status": 200, + "final_url": "https://downshiftology.com/recipes/shakshuka/", + "error": null, + "profile": "automation", + "content_type": "text/html; charset=UTF-8", + "content_encoding": "gzip", + "candidate": "https://downshiftology.com/recipes/shakshuka/", + "request_headers": "{\"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"en-US,en;q=0.8\", \"Accept-Encoding\": \"gzip, deflate\", \"Connection\": \"keep-alive\", \"User-Agent\": \"MunchEaseRecipeBot/1.0 (+https://example.com/bot)\", \"From\": \"bot@example.com\"}" +} \ No newline at end of file diff --git a/tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.recipe.json b/tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.recipe.json new file mode 100644 index 0000000..73f01a9 --- /dev/null +++ b/tests/sample_files/recipes/downshiftology.com-recipes-shakshuka.recipe.json @@ -0,0 +1,178 @@ +{ + "id": -1, + "name": "Shakshuka Recipe (Easy & Traditional)", + "link": "https://downshiftology.com/recipes/shakshuka/", + "serves": 6, + "imageUrls": [ + "https://i2.wp.com/www.downshiftology.com/wp-content/uploads/2023/12/Shakshuka-main-1.jpg", + "https://downshiftology.com/wp-content/uploads/2023/12/Shakshuka-main-1-500x500.jpg", + "https://downshiftology.com/wp-content/uploads/2023/12/Shakshuka-main-1-500x375.jpg", + "https://downshiftology.com/wp-content/uploads/2023/12/Shakshuka-main-1-480x270.jpg" + ], + "ingredients": [ + { + "id": -1, + "name": "olive oil", + "line": "2 tablespoons olive oil", + "unit": "Tablespoon", + "quantity": 2.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "onion", + "line": "1 medium onion (diced)", + "unit": "Items", + "quantity": 1.0, + "preparation": "(diced)", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "red bell pepper", + "line": "1 red bell pepper (seeded and diced)", + "unit": "Items", + "quantity": 1.0, + "preparation": "(seeded and diced)", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "garlic", + "line": "4 garlic cloves (finely chopped)", + "unit": "Items", + "quantity": 4.0, + "preparation": "(finely chopped)", + "productId": 2, + "recipeId": null, + "mealId": null, + "product": { + "id": 2, + "productId": "294517", + "shopCode": "woolworths", + "link": "https://www.woolworths.com.au/shop/productdetails/294517/la-famiglia-garlic-bread", + "name": "La Famiglia Garlic Bread", + "quantity": 1, + "unit": "Loaf", + "imgSmall": "https://cdn0.woolworths.media/content/wowproductimages/small/294517.jpg", + "imgLarge": "https://cdn0.woolworths.media/content/wowproductimages/large/294517.jpg" + } + }, + { + "id": -1, + "name": "paprika", + "line": "2 teaspoon paprika", + "unit": "Teaspoon", + "quantity": 2.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "cumin", + "line": "1 teaspoon cumin", + "unit": "Teaspoon", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "chili powder", + "line": "¼ teaspoon chili powder", + "unit": "Teaspoon", + "quantity": 0.25, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "whole peeled tomatoes", + "line": "1 (28-ounce can) whole peeled tomatoes", + "unit": "Ounce", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "eggs", + "line": "6 large eggs", + "unit": "Items", + "quantity": 6.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "salt and pepper", + "line": "salt and pepper (to taste)", + "unit": "Items", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "fresh cilantro", + "line": "1 small bunch fresh cilantro (chopped)", + "unit": "Items", + "quantity": 1.0, + "preparation": "(chopped)", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "fresh parsley", + "line": "1 small bunch fresh parsley (chopped)", + "unit": "Items", + "quantity": 1.0, + "preparation": "(chopped)", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + } + ], + "basedOnRecipe": null, + "dateCreated": "2025-11-04T18:24:29.453255+11:00", + "createdById": 1, + "createdBy": { + "id": 1, + "displayName": "Snapshot Generator" + }, + "dateHidden": null, + "hiddenById": null, + "hiddenBy": null +} \ No newline at end of file diff --git a/tests/sample_files/recipes/pinchofyum.com-lemon-chicken-piccata-with-grilled-bread.html b/tests/sample_files/recipes/pinchofyum.com-lemon-chicken-piccata-with-grilled-bread.html new file mode 100644 index 0000000..012322d --- /dev/null +++ b/tests/sample_files/recipes/pinchofyum.com-lemon-chicken-piccata-with-grilled-bread.html @@ -0,0 +1,2397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lemon Chicken Piccata with Grilled Bread Recipe - Pinch of Yum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
icon-arrowicon-chevron-whiteicon-chevronicon-commenticon-facebookicon-hearticon-instagramicon-instant-poticon-listicon-lockicon-meal-prepicon-nexticon-pinteresticon-popularicon-quoteicon-searchicon-staricon-sugar-freeicon-tiktokicon-twittericon-veganicon-videoicon-youtubemenu-closemenu-open
+
+ + + Our recipes, your inbox. Sign up + +
+ +
+ + + +
+ +
+ + +
+ +
+
+
+
+

Lemon Chicken Piccata with Grilled Bread

+ +
+
+
+ 41 reviews / 4.6 average +
+
+
+
+
+ + + +
+ + + +
+ + + + + + +

Today’s post is sponsored by Land O’Lakes – we  their European Style Super Premium Butter with all the heart-eyed emojis.

+ + + +
+ + + +

Is it just me or is chicken starting to be awesome again?

+ + + +

Through the last few years, Pinch of Yum aka my-personal-self went through a phase of chicken rebellion. I was doing things like creating meals with plant-based things like MUSHROOMS or NUTS or TOFU. Okay waaaait I still really love mushrooms and nuts and tofu and I am definitely still a part-time vegetarian with a deep love for the whole plant-based thing. Exhibit A.

+ + + +

But somewhere between the garlic and basil // the lemon and capers // the gold standard of BUTTER: me and chicken are back in business over here.

+ + + +

And today I’d like to present to you with my latest chicken favorite which is, in essence, juicy chicken breasts coated in a white wine lemon butter sauce situation and dotted (overwhelmingly dotted, if you will allow it) with those irresistibly briny capers. My mouth is watering. WAH TER ING. 👅

+ + + +

Oh, chicken piccata, you beauty, you.

+ + + +
Chicken Piccata - you won't believe how easy this recipe is! Perfect with a green salad and grilled bread for soaking up all the extra sauce. | pinchofyum.com
+ + + + + + + +

Now, I say all that about chicken but now I’m going to go and tell you the truth. The truth is that it’s not chicken that makes this amazing – it’s the combo of flavors in the sauce.

+ + + +

P.S. Welcome to my sauce blog. Food? That’s nice. But SAUCE? I can’t even. I need all of the sauces, ever. This has been a slow fade over the last five years, but I think we can officially say we’re there. New job title: Sauce Blogger.

+ + + +

When you simmer a white wine reduction with tangy lemon slices and salty chicken broth, good things are going to happen. Good as in magical. Good as in why are you still reading this post. W-H-Y.

+ + + +

But friends, you don’t stop there. No. You are hungry for the mouth-puckering brine of the capers, aren’t you? I just knew it. You and I jive with this whole sauce blogging thing. So the important next step is that you get extra-generous and you throw the whole darn jar of those little green-ish poppers up in the mix.

+ + + +

I’m literally puckering my mouth right now as I imagine how salty-tangy it is.

+ + + +

Right? RIGHT? Oh my gosh, it’s so good.

+ + + +

And that’s exactly what you do.

+ + + +
Chicken Piccata - you won't believe how easy this recipe is! Perfect with a green salad and grilled bread for soaking up all the extra sauce. | pinchofyum.com
+ + + +
Chicken Piccata - you won't believe how easy this recipe is! Perfect with a green salad and grilled bread for soaking up all the extra sauce. | pinchofyum.com
+ + + +

This whole sauce wouldn’t be complete without the gold standard of creamy and luscious – LAND O LAKES® European Style Super Premium Butter. That velvety finish to your sauce takes it to the NEXT LEVEL, man.

+ + + +

Speaking of levels. Grilled bread is on the scene and we’re going to Level 500 now.

+ + + +

If this recipe is about the sauce, then this recipe is really about the bread, because you just fry that bread up in a little olive oil and butter (or grill, if it’s summery where you live because it will look cooler with grill marks, but I live in Minnesota where it’s already cold and dark by 6pm and so I “grill” in a skillet, okay? don’t be mad) and then you dunk said buttery golden brown bread into the leftover sauce.

+ + + +

Demo in three, two…

+ + + +
Chicken Piccata - you won't believe how easy this recipe is! Perfect with a green salad and grilled bread for soaking up all the extra sauce. | pinchofyum.com
+ + + +

I am excited for you. 👌

+ + + +Print
+clock clock iconcutlery cutlery iconflag flag iconfolder folder iconinstagram instagram iconpinterest pinterest iconfacebook facebook iconprint print iconsquares squares iconheart heart iconheart solid heart solid icon +
+
+ Lemon Chicken Piccata in a pan.
+

Lemon Chicken Piccata with Grilled Bread

+
+
+

5 Stars 4 Stars 3 Stars 2 Stars 1 Star

+

4.6 from 41 reviews

+
+
+
    +
  • + Author: Pinch of Yum
  • +
  • + + Total Time: 30 mins
  • +
  • + + Yield: 4 pieces 1x
  • +
+
+
+ +
+ +
+
+ + + + Print +
+
+ + + +
+
+ +
+

Description

+
+

Chicken Piccata – you won’t believe how easy this recipe is! Perfect with a green salad and grilled bread for soaking up all the extra sauce.

+
+
+ +
+ +
+
+
+

Ingredients

+
+
+ Units + + + Scale + + +
+
+
    +
  • 1 pound boneless skinless chicken breasts
  • +
  • 1/2 cup flour
  • +
  • salt and pepper
  • +
  • 4 tablespoons LAND O LAKES® European Style Super Premium Salted Butter
  • +
  • 2 tablespoons olive oil
  • +
  • 1/2 cup white wine
  • +
  • 1 1/2 cups chicken broth
  • +
  • 1 large lemon, sliced thinly (leave about 1/4 of the lemon intact for the juice)
  • +
  • 1/4 cup jarred capers
  • +
  • fresh parsley
  • +
+
+
+ + +
+
+
+ +
+ +
+
+

Instructions

+
+
+
    +
  1. Cut the chicken breasts in half so that you have a total of four pieces. Cover with plastic wrap and pound them to an even thickness of about 1/2 inch or less. Place the flour in a bowl with some salt and pepper. Dredge the chicken in the flour mixture and set aside.
  2. +
  3. Heat 2 tablespoons of butter and the olive oil in a heavy skillet over medium high heat. Add the chicken and fry for a few minutes, flipping once. Both sides should be golden brown. Remove chicken and set aside.
  4. +
  5. Add the wine to the skillet and let it get all sizzly so you can scrape browned bits off the bottom. Add the broth and lemon slices. Let the mixture reduce to half or less. Add the capers, butter, and any remaining juice you can get out of the lemon nubs. Arrange the chicken pieces back in the pan and sprinkle with fresh parsley. VOILA!
  6. +
+
+
+ + + + +
+

Notes

+
+

For the “grilled bread,” you have a few options. You could brush a few pieces of sliced baguette or country loaf with butter and actually grill it on a grill or toast it in the oven.

+

But my FAVORITE is sort of a grill/fry situation – heat a thin layer of oil AND butter together in a heavy skillet and add a few pieces of bread to each side, flipping once until both sides are golden brown and heavenly. Drain on paper towels, and now use the crispy golden brown bread to sop up that briny sauce. Ugh, I’m drooling. It’s so, so good.

+
+
+ +
+
    +
  • Prep Time: 10 mins
  • Cook Time: 30 mins
  • Category: Dinner
  • Cuisine: Italian
+
+ + +
+
+ + +
+

Keywords: chicken piccata, lemon chicken piccata, grilled bread

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

Pinch of Yum has partnered with Land O’Lakes for an exclusive endorsement of LAND O LAKES® European Style Super Premium Butter. This post is sponsored by Land O’Lakes.

+ + + +
+ + + +

One More Thing!

+ + + +

This recipe is part of our easy Italian-inspired recipes page. Check it out!

+
+ + +
+ +
+

Leave a Reply

Your email address will not be published. Required fields are marked *

+ Recipe rating + 5 Stars 4 Stars 3 Stars 2 Stars 1 Star
+

+ +

+ +

+ +

+ + + +

168 Comments

+ +
    + +
  1. +
    +
    + Pinch of Yum Logo
    +
    + +

    So I’ve never had a caper (I’m ashamed) but I love everything else about this chicken dish. It sounds almost identical to chicken Francaise, which I love! Maybe it’s time I go buy a jar of capers?

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. + +
    3. +
      +
      + Pinch of Yum Logo
      +
      + +

      Capers are very good. You will be glad you bought tjem 🙂

      +
      +
      + Reply
      +
      +
      +
        + +
      1. + +
          + +
        1. +
          +
          + Pinch of Yum Logo
          +
          + +

          No problem Aretha. I think most of us figured it out …

          +

          + +
          + Reply
          +
          +
          +
        2. +
        +
      2. +
      +
    4. +
    +
  2. + +
  3. +
    +
    + Pinch of Yum Logo
    +
    + +

    Anything with chicken, lemon, butter or capers makes me very, very happy. So obviously I’m rather excited to try this!

    +

    + +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  4. + +
  5. + +
      + +
    1. + +
    2. +
    +
  6. + +
  7. + +
      + +
    1. + +
    2. +
    +
  8. + +
  9. + +
      + +
    1. + +
    2. +
    +
  10. + +
  11. +
    +
    + Pinch of Yum Logo
    +
    + +

    The fact that I find this delicious, even though I don’t like capers, says enough. And at my place chicken was always awesome 🙂

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  12. + +
  13. + +
      + +
    1. + +
    2. +
    +
  14. + +
  15. +
    +
    + Pinch of Yum Logo
    +
    + +

    I am practically salivating. Sopping up that buttery goodness with that bread…heavenly!

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  16. + +
  17. +
    +
    + Pinch of Yum Logo
    +
    + +

    I follow your blog for the plant based food but I am determined to make this sauce with something vegetarian because it looks so amazing! Any suggestions?

    +
    +
    + Reply
    +
    +
    +
      + +
    1. +
      +
      + Pinch of Yum Logo
      +
      + +

      Im gonna try it with Tofu..Give it a try if u like tofu..

      +

      + +
      + Reply
      +
      +
      +
    2. + +
    3. +
      +
      + Pinch of Yum Logo
      +
      + +

      Hi, Laura! I think this sauce has various vegetarian options that would go well… Tofu, tempeh, fried eggplant, fried zucchini, or just mixed vegetables!

      +
      +
      + Reply
      +
      +
      +
    4. +
    +
  18. + +
  19. + +
      + +
    1. + +
    2. +
    +
  20. + +
  21. + +
      + +
    1. + +
    2. +
    +
  22. + +
  23. +
    +
    + Pinch of Yum Logo
    +
    + +

    I’m always about the butter. Give me the good stuff! And this chicken looks perfectly cooked. Mmm…

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  24. + +
  25. + +
      + +
    1. + +
    2. +
    +
  26. + +
  27. +
    +
    + Pinch of Yum Logo
    +
    + +

    Yum, yum, yum! I want to make this, but I lack confidence frying the chicken. Can you give more info on how hot the pan should be and how many minutes on each side- or a tip on how you know when the chicken is perfect? Thanks so much!

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. + +
    3. +
      +
      + Pinch of Yum Logo
      +
      + +

      It really depends on your burner and how powerful it is, also how thick the chicken breast is, and what type of pan you’re using. I find nonstick cookware to be a little more forgiving when it comes to chicken. In general, 4-5 minutes per side should be plenty.

      +
      +
      + Reply
      +
      +
      +
    4. +
    +
  28. + +
  29. + +
  30. + +
  31. +
    +
    + Pinch of Yum Logo
    +
    + +

    Okay, I just need to say WOAH. I am SERIOUS. Over the last year or so you have just gone to a whole new level of yummy…I mean no wonder DeLallo and European Style Butter want to partner up with you. You are doing awesome, Lindsay! Such rich content and sophisticated yet simplistic dishes all over this site 🙂 ten thumbs up 😉

    +

    + +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  32. + +
  33. + +
      + +
    1. + +
    2. +
    +
  34. + +
  35. +
    +
    + Pinch of Yum Logo
    +
    + +

    This recipe looks amazing!! Chicken Piccata was one of the very first recipes I ever learned to make in Culinary School! So very delicious…capers are a great little salty treat! I agree about butter being the most important part of this meal:)

    +

    + +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  36. + +
  37. +
    +
    + Pinch of Yum Logo
    +
    + +

    Dark and cold where I am too…. bring on the comfort foods (and butter AND all the BREAD!!) 🙂

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  38. + +
  39. +
    +
    + Pinch of Yum Logo
    +
    + +

    You do know that sometimes I just come here for the drool worthy photos, right? Oh yum!

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  40. + +
  41. +
    +
    + Pinch of Yum Logo
    +
    + +

    Try using chicken thighs…so much more flavor, and they don’t dry out as much!

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  42. + +
  43. +
    +
    + Pinch of Yum Logo
    +
    + +

    Wow. I wasn’t even hungry then I saw this and I’m ravenous! Love capers 🙂

    +

    + +
    + Reply
    +
    +
    +
  44. + +
  45. +
    +
    + Pinch of Yum Logo
    +
    + +

    Chicken Piccata is so underrated. It’s my go-to at Itallian restaurants.

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  46. + +
  47. +
    +
    + Pinch of Yum Logo
    +
    + +

    You are terrific! I am so excited that I found your blog through bloglovin. Now I’ll be following all your recipes! Thank you!

    +
    +
    + Reply
    +
    +
    +
      + +
    1. + +
    2. +
    +
  48. + +
  49. + +
  50. +
+ + + +
+
+ +
+ +
+ + +
+ + +
+ + + + + + + + + + + + + + + + diff --git a/tests/sample_files/recipes/www.kingarthurbaking.com-recipes-banana-bread-recipe.meta.json b/tests/sample_files/recipes/www.kingarthurbaking.com-recipes-banana-bread-recipe.meta.json new file mode 100644 index 0000000..e3b090e --- /dev/null +++ b/tests/sample_files/recipes/www.kingarthurbaking.com-recipes-banana-bread-recipe.meta.json @@ -0,0 +1,12 @@ +{ + "url": "https://www.kingarthurbaking.com/recipes/banana-bread-recipe", + "fetched_at": "2025-11-04T07:23:56.767749+00:00", + "status": 200, + "final_url": "https://www.kingarthurbaking.com/recipes/banana-bread-recipe", + "error": null, + "profile": "automation", + "content_type": "text/html; charset=UTF-8", + "content_encoding": "gzip", + "candidate": "https://www.kingarthurbaking.com/recipes/banana-bread-recipe", + "request_headers": "{\"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"en-US,en;q=0.8\", \"Accept-Encoding\": \"gzip, deflate\", \"Connection\": \"keep-alive\", \"User-Agent\": \"MunchEaseRecipeBot/1.0 (+https://example.com/bot)\", \"From\": \"bot@example.com\"}" +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.kingarthurbaking.com-recipes-banana-bread-recipe.recipe.json b/tests/sample_files/recipes/www.kingarthurbaking.com-recipes-banana-bread-recipe.recipe.json new file mode 100644 index 0000000..1467c46 --- /dev/null +++ b/tests/sample_files/recipes/www.kingarthurbaking.com-recipes-banana-bread-recipe.recipe.json @@ -0,0 +1,199 @@ +{ + "id": -1, + "name": "Banana Bread", + "link": "https://www.kingarthurbaking.com/recipes/banana-bread-recipe", + "serves": 18, + "imageUrls": [ + "https://www.kingarthurbaking.com/sites/default/files/recipe_legacy/5-3-large.jpg" + ], + "ingredients": [ + { + "id": -1, + "name": "unsalted butter", + "line": "8 tablespoons (113g) unsalted butter, at cool room temperature", + "unit": "Tablespoon", + "quantity": 8.0, + "preparation": "at cool room temperature", + "productId": 4, + "recipeId": null, + "mealId": null, + "product": { + "id": 4, + "productId": "712251", + "shopCode": "woolworths", + "link": "https://www.woolworths.com.au/shop/productdetails/712251/western-star-unsalted-butter-chef-s-choice", + "name": "Western Star Unsalted Butter Chef's Choice", + "quantity": 500, + "unit": "g", + "imgSmall": "https://cdn0.woolworths.media/content/wowproductimages/small/712251.jpg", + "imgLarge": "https://cdn0.woolworths.media/content/wowproductimages/large/712251.jpg" + } + }, + { + "id": -1, + "name": "light brown sugar or dark brown sugar", + "line": "2/3 cup (142g) light brown sugar or dark brown sugar, packed", + "unit": "Cup", + "quantity": 0.667, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "King Arthur Pure Vanilla Extract", + "line": "1 teaspoon King Arthur Pure Vanilla Extract", + "unit": "Teaspoon", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "cinnamon", + "line": "1 teaspoon cinnamon", + "unit": "Teaspoon", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "nutmeg", + "line": "1/4 teaspoon nutmeg", + "unit": "Teaspoon", + "quantity": 0.25, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "baking soda", + "line": "1 teaspoon baking soda", + "unit": "Teaspoon", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "baking powder", + "line": "1 teaspoon baking powder", + "unit": "Teaspoon", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "table salt", + "line": "1 teaspoon table salt", + "unit": "Teaspoon", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "bananas", + "line": "1 1/2 cups (340g) bananas, mashed", + "unit": "Cup", + "quantity": 1.5, + "preparation": "mashed", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "apricot jam or orange marmalade", + "line": "3 tablespoons (64g) apricot jam or orange marmalade, optional but tasty", + "unit": "Tablespoon", + "quantity": 3.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "honey", + "line": "1/4 cup (85g) honey", + "unit": "Cup", + "quantity": 0.25, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "eggs", + "line": "2 large eggs", + "unit": "Items", + "quantity": 2.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "King Arthur Unbleached All-Purpose Flour", + "line": "2 1/4 cups (270g) King Arthur Unbleached All-Purpose Flour", + "unit": "Cup", + "quantity": 2.25, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "walnuts", + "line": "1/2 cup (57g) chopped walnuts, optional", + "unit": "Cup", + "quantity": 0.5, + "preparation": "chopped", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + } + ], + "basedOnRecipe": null, + "dateCreated": "2025-11-04T18:24:29.834444+11:00", + "createdById": 1, + "createdBy": { + "id": 1, + "displayName": "Snapshot Generator" + }, + "dateHidden": null, + "hiddenById": null, + "hiddenBy": null +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.html b/tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.html new file mode 100644 index 0000000..63c91c6 --- /dev/null +++ b/tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.html @@ -0,0 +1,2673 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beef Stroganoff - RecipeTin Eats + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.meta.json b/tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.meta.json new file mode 100644 index 0000000..b7e5ca4 --- /dev/null +++ b/tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.meta.json @@ -0,0 +1,12 @@ +{ + "url": "https://www.recipetineats.com/beef-stroganoff/", + "fetched_at": "2025-11-04T07:23:56.628726+00:00", + "status": 200, + "final_url": "https://www.recipetineats.com/beef-stroganoff/", + "error": null, + "profile": "automation", + "content_type": "text/html; charset=UTF-8", + "content_encoding": "gzip", + "candidate": "https://www.recipetineats.com/beef-stroganoff/", + "request_headers": "{\"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"en-US,en;q=0.8\", \"Accept-Encoding\": \"gzip, deflate\", \"Connection\": \"keep-alive\", \"User-Agent\": \"MunchEaseRecipeBot/1.0 (+https://example.com/bot)\", \"From\": \"bot@example.com\"}" +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.recipe.json b/tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.recipe.json new file mode 100644 index 0000000..eee5d16 --- /dev/null +++ b/tests/sample_files/recipes/www.recipetineats.com-beef-stroganoff.recipe.json @@ -0,0 +1,178 @@ +{ + "id": -1, + "name": "Beef Stroganoff", + "link": "https://www.recipetineats.com/beef-stroganoff/", + "serves": 4, + "imageUrls": [ + "https://www.recipetineats.com/tachyon/2018/01/Beef-Stroganoff_2-1-1.jpg", + "https://www.recipetineats.com/tachyon/2018/01/Beef-Stroganoff_2-1-1.jpg?resize=500%2C500", + "https://www.recipetineats.com/tachyon/2018/01/Beef-Stroganoff_2-1-1.jpg?resize=500%2C375", + "https://www.recipetineats.com/tachyon/2018/01/Beef-Stroganoff_2-1-1.jpg?resize=480%2C270" + ], + "ingredients": [ + { + "id": -1, + "name": "scotch fillet steak / boneless rib eye", + "line": "600 g / 1.2 lb scotch fillet steak / boneless rib eye ((Note 1))", + "unit": "Gram", + "quantity": 600.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "vegetable oil", + "line": "2 tbsp vegetable oil (, divided)", + "unit": "Tablespoon", + "quantity": 2.0, + "preparation": "(, divided)", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "onion", + "line": "1 large onion ((or 2 small onions), sliced)", + "unit": "Items", + "quantity": 1.0, + "preparation": "sliced", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "mushrooms", + "line": "300 g / 10 oz mushrooms (, sliced (not too thin))", + "unit": "Gram", + "quantity": 300.0, + "preparation": ", sliced", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "butter", + "line": "40 g / 3 tbsp butter", + "unit": "Gram", + "quantity": 40.0, + "preparation": "", + "productId": 4, + "recipeId": null, + "mealId": null, + "product": { + "id": 4, + "productId": "712251", + "shopCode": "woolworths", + "link": "https://www.woolworths.com.au/shop/productdetails/712251/western-star-unsalted-butter-chef-s-choice", + "name": "Western Star Unsalted Butter Chef's Choice", + "quantity": 500, + "unit": "g", + "imgSmall": "https://cdn0.woolworths.media/content/wowproductimages/small/712251.jpg", + "imgLarge": "https://cdn0.woolworths.media/content/wowproductimages/large/712251.jpg" + } + }, + { + "id": -1, + "name": "flour", + "line": "2 tbsp flour ((Note 2))", + "unit": "Tablespoon", + "quantity": 2.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "beef broth", + "line": "2 cups / 500 ml beef broth (, preferably salt reduced)", + "unit": "Cup", + "quantity": 2.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "Dijon mustard", + "line": "1 tbsp Dijon mustard", + "unit": "Tablespoon", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "sour cream", + "line": "150 ml / 2/3 cup sour cream", + "unit": "Cup", + "quantity": 150.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "Salt and pepper", + "line": "Salt and pepper", + "unit": "Items", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "pasta or egg noodles of choice", + "line": "250 - 300 g / 8 - 10 oz pasta or egg noodles of choice ((Note 3))", + "unit": "Gram", + "quantity": 250.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "chives", + "line": "Chopped chives (, for garnish (optional))", + "unit": "Items", + "quantity": 1.0, + "preparation": "Chopped", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + } + ], + "basedOnRecipe": null, + "dateCreated": "2025-11-04T18:24:29.900537+11:00", + "createdById": 1, + "createdBy": { + "id": 1, + "displayName": "Snapshot Generator" + }, + "dateHidden": null, + "hiddenById": null, + "hiddenBy": null +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.html b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.html new file mode 100644 index 0000000..ba24835 --- /dev/null +++ b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.html @@ -0,0 +1,4194 @@ + + + + + + + + + + + + +The Best French Toast Recipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to Content + + +
+
+
+
+ +
+

The Best French Toast

+

Fluffy and tender inside, gloriously browned outside, this is the very best recipe for the brunch classic.

+
+ + +
+
+
+
+

Why Make This

+
  • By using stale, thick French or Italian bread, rather than fresh sandwich loaf bread, you'll get French toast that holds up better.
  • Adding orange zest and a bit of Triple Sec orange liqueur to the batter gives it a little extra zing.
  • Experiment with toppings—chocolate chips, lemon curd, cinnamon sugar, and more.
+

Is there nothing better than French toast for Sunday breakfast? +

+
+

Thick slices of bread, soaked in a mixture of beaten eggs with milk and cinnamon, toasted in a frying pan, and served with butter and maple syrup. This has to be one of our favorite, and most indulgent, breakfast dishes. +

+
+
+
+ + +
+

Simply Recipes / Photo by Julia Gartland / Food Styling by Barrett Washburne

+
+

Best Bread for French Toast

+

French toast comes out best if you work with thick slices of French or Italian loaf bread that are several days old. That way they've had a chance to firm up, which will make the slices hold up better when you dip them in the egg milk mixture and fry them. +

+
+

Thin slices of fresh bread tend to fall apart or get mushy when you do this, making for lousy French toast. +

+
+

French Toast Additions

+
    +
  • Powdered Sugar: Many people love to sprinkle powdered sugar over their French toast! Personally, I think there's plenty enough sugar in the maple syrup, so I don't bother with adding more.
  • +
  • Orange zest and Triple Sec: One of my favorite variations, the idea for which I picked up from The Silver Palate Cookbook 20-some odd years ago, is to add some orange zest and a bit of Triple Sec orange liqueur to the batter for extra zing.
  • +
+
+
+
+ + +
+

Simply Recipes / Photo by Julia Gartland / Food Styling by Barrett Washburne

+
+

How To Keep French Toast Warm

+

Preheat your oven to 170°F, and place a baking sheet in it. Transfer cooked slices of French toast to the baking sheet in a single layer to keep warm as you're cooking additional slices. Do not place the slices on top of each other or they will get soggy. +

+

Best Toppings for French Toast

+

The classic topping for French toast is butter and maple syrup (or pancake syrup), but feel free to get creative with these toppings. Choose one or mix and match. +

+
    +
  • Chocolate chips
  • +
  • Ripe banana slices
  • +
  • Fresh berries like strawberries, blueberries, and raspberries
  • +
  • Whipped cream
  • +
  • Lemon curd
  • +
  • Chocolate-hazelnut spread
  • +
  • Cinnamon sugar
  • +
  • Apple butter
  • +
+

More Ways to French Your Toast

+ +
From the Editors Of Simply Recipes
+
+
+
+

The Best French Toast +

+
+
+
+ +Prep Time +5 mins + +
+
+ +Cook Time +15 mins + +
+
+ +Total Time +20 mins + +
+
+
+
+ +Servings +4 servings + +
+
+
+
+ +Keep Screen Awake + +
+

Ingredients

+
+
    +
  • +

    4 large eggs

    +
  • +
  • +

    2/3 cup milk

    +
  • +
  • +

    2 teaspoons cinnamon

    +
  • +
  • +

    8 thick slices 2-day-old bread (better if slightly stale)

    +
  • +
  • +

    Butter (can sub vegetable oil)

    +
  • +
  • +

    Maple syrup

    +
  • +
+

Optional

+
    +
  • +

    2 teaspoons freshly grated orange zest

    +
  • +
  • +

    1/4 cup triple sec

    +
  • +
  • +

    Fresh berries

    +
  • +
+
+
+
+
+
+
+

Method

+
    +
  1. +
    Make the egg mixture:
    +

    In a medium bowl, whisk together the eggs, milk, and cinnamon. Stir in the orange zest and/or triple sec if using. Whisk the mixture until well blended and pour into a shallow bowl, wide enough to place a slice of the bread you will be using. +

    +
    +
    + + +
    +

    Simply Recipes / Annika Panikker

    +
    +
    +
  2. +
  3. +
    Soak the bread slices in egg mixture:
    +

    Place each slice of bread into the milk egg mixture, allowing the bread to soak in some of it. +

    +
    +
    + + +
    +

    Simply Recipes / Annika Panikker

    +
    +
    +
    + + +
    +

    Simply Recipes / Annika Panikker

    +
    +
    +
  4. +
  5. +
    Fry the French toast:
    +

    Melt some butter in a large skillet over medium high heat. Shake off the excess egg mixture from the bread and place the bread slices onto the hot skillet. Fry the French toast until browned on one side, then flip and brown the other side. +

    +
    +
    + + +
    +

    Simply Recipes / Annika Panikker

    +
    +
    +
    + + +
    +

    Simply Recipes / Annika Panikker

    +
    +
    +
  6. +
  7. +
    Serve:
    +

    Serve the French toast hot with butter, maple syrup, and/or fresh berries. +

    +

    Did you love this recipe? Let us know with a rating and review!
    +

    +
    +
    + + +
    +

    Simply Recipes / Photo by Julia Gartland / Food Styling by Barrett Washburne

    +
    +
    +
  8. +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Nutrition Facts (per serving)
455Calories
19g Fat
59g Carbs
13g Protein
+
+
+
×
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nutrition Facts
Servings: 4
Amount per serving
Calories455
% Daily Value*
Total Fat 19g24%
Saturated Fat 10g49%
Cholesterol 220mg73%
Sodium 471mg20%
Total Carbohydrate 59g21%
Dietary Fiber 2g8%
Total Sugars 30g
Protein 13g
Vitamin C 0mg1%
Calcium 218mg17%
Iron 3mg17%
Potassium 293mg6%
*The % Daily Value (DV) tells you how much a nutrient in a food serving contributes to a daily diet. 2,000 calories a day is used for general nutrition advice.
+
+
+
Nutrition information is calculated using an ingredient database and should be considered an estimate. In cases where multiple ingredient alternatives are given, the first listed is calculated for nutrition. Garnishes and optional ingredients are not included.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.meta.json b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.meta.json new file mode 100644 index 0000000..4308c9d --- /dev/null +++ b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.meta.json @@ -0,0 +1,12 @@ +{ + "url": "https://www.simplyrecipes.com/recipes/french_toast/", + "fetched_at": "2025-11-04T07:23:56.582449+00:00", + "status": 200, + "final_url": "https://www.simplyrecipes.com/recipes/french_toast/", + "error": null, + "profile": "automation", + "content_type": "text/html;charset=utf-8", + "content_encoding": "gzip", + "candidate": "https://www.simplyrecipes.com/recipes/french_toast/", + "request_headers": "{\"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"en-US,en;q=0.8\", \"Accept-Encoding\": \"gzip, deflate\", \"Connection\": \"keep-alive\", \"User-Agent\": \"MunchEaseRecipeBot/1.0 (+https://example.com/bot)\", \"From\": \"bot@example.com\"}" +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.recipe.json b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.recipe.json new file mode 100644 index 0000000..1e2af79 --- /dev/null +++ b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-french_toast.recipe.json @@ -0,0 +1,139 @@ +{ + "id": -1, + "name": "The Best French Toast", + "link": "https://www.simplyrecipes.com/recipes/french_toast/", + "serves": 4, + "imageUrls": [ + "https://www.simplyrecipes.com/thmb/34kTh59L8NjsXOB8nqw3hdYIKbs=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/Simply-Recipes-Best-French-Toast-LEAD-4-ce3d4ce3d69b4c79a7bb3d9b83c8c3fc.jpg" + ], + "ingredients": [ + { + "id": -1, + "name": "eggs", + "line": "4 eggs", + "unit": "Items", + "quantity": 4.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "milk", + "line": "2/3 cup milk", + "unit": "Cup", + "quantity": 0.667, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "cinnamon", + "line": "2 teaspoons cinnamon", + "unit": "Teaspoon", + "quantity": 2.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "2-day-old bread", + "line": "8 thick slices 2-day-old bread (better if slightly stale)", + "unit": "Items", + "quantity": 8.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "Butter", + "line": "Butter (can sub vegetable oil)", + "unit": "Items", + "quantity": 1.0, + "preparation": "", + "productId": 4, + "recipeId": null, + "mealId": null, + "product": { + "id": 4, + "productId": "712251", + "shopCode": "woolworths", + "link": "https://www.woolworths.com.au/shop/productdetails/712251/western-star-unsalted-butter-chef-s-choice", + "name": "Western Star Unsalted Butter Chef's Choice", + "quantity": 500, + "unit": "g", + "imgSmall": "https://cdn0.woolworths.media/content/wowproductimages/small/712251.jpg", + "imgLarge": "https://cdn0.woolworths.media/content/wowproductimages/large/712251.jpg" + } + }, + { + "id": -1, + "name": "Maple syrup", + "line": "Maple syrup", + "unit": "Items", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "orange zest", + "line": "2 teaspoons freshly grated orange zest", + "unit": "Teaspoon", + "quantity": 2.0, + "preparation": "freshly grated", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "Triple Sec", + "line": "1/4 cup Triple Sec", + "unit": "Cup", + "quantity": 0.25, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "Fresh berries", + "line": "Fresh berries", + "unit": "Items", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + } + ], + "basedOnRecipe": null, + "dateCreated": "2025-11-04T18:24:29.962968+11:00", + "createdById": 1, + "createdBy": { + "id": 1, + "displayName": "Snapshot Generator" + }, + "dateHidden": null, + "hiddenById": null, + "hiddenBy": null +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.html b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.html new file mode 100644 index 0000000..4ef00c6 --- /dev/null +++ b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.html @@ -0,0 +1,4296 @@ + + + + + + + + + + + + +The Best Guacamole Recipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to Content + + +
+
+
+
+ +
+

How to Make the Best Guacamole

+

The best guacamole keeps it simple: just ripe avocados and a handful of flavorful mix-ins.

+
+ + +
+
+
+
+

Guacamole! Did you know that over 2 billion pounds of avocados are consumed each year in the U.S.? (Google it.) That's over 7 pounds per person. I'm guessing that most of those avocados go into what has become America's favorite dip: guacamole. +

+
+

Guacamole: A Classic Mexican Dish

+

The word "guacamole" and the dip, are both originally from Mexico, where avocados have been cultivated for thousands of years. The name is derived from two Aztec Nahuatl words—ahuacatl (avocado) and molli (sauce). +

+
+

Ingredients for Easy Guacamole

+

All you really need to make guacamole is ripe avocados and salt. After that, a little lime or lemon juice—a splash of acidity—will help balance the richness of the avocado. If you want, add chopped cilantro, chilis, onion, and/or tomato. +

+
+

How To Pick Perfectly Ripe Avocados

+

The trick to making perfect guacamole is using avocados that are just the right amount of ripeness. Not ripe enough and the avocado will be hard and flavorless. Too ripe and the taste will be off. +

+
+

Check for ripeness by gently pressing the outside of the avocado. If there is no give, the avocado is not ripe yet. If there is a little give, the avocado is ripe. If there is a lot of give, the avocado may be too ripe and not good. In this case, taste test first before using. +

+
+ +
+
+
+ + +
+

Simply Recipes / Elise Bauer

+
+

How To Cut an Avocado

+

To slice open an avocado, cut it in half lengthwise with a sharp chef's knife and twist apart. One side will have the pit. To remove it, you can carefully tap your chef’s knife against the pit and twist to dislodge it (protecting your hand with a towel), or you can cut the avocado into quarters and remove the pit with your fingers or a spoon. +

+
+ +
+

Other Ways To Use Guacamole

+
+
+ + +
+
Elise Bauer +
+

Guacamole has a role in the kitchen beyond a party dip. It's great scooped on top of nachos and also makes an excellent topping or side for enchiladas, tacos, grilled salmon, or oven-baked chicken. +

+
+

Guacamole is great in foods, as well. Try mixing some into a tuna sandwich or your next batch of deviled eggs. +

+
+

How To Store Guacamole So It Stays Green

+

Guacamole is best eaten right after it's made. Like apples, avocados start to oxidize and turn brown once they've been cut. That said, the acid in the lime juice you add to guacamole can help slow down that process. And if you store the guacamole properly, you can easily make it a few hours ahead if you are preparing for a party. +

+
+

The trick to keeping guacamole green is to make sure air doesn't touch it! Transfer it to a container, cover with plastic wrap, and press down on the plastic wrap to squeeze out any air pockets. Make sure any exposed surface of the guacamole is touching the plastic wrap, not air. This will keep the amount of browning to a minimum. +

+
+

You can store the guacamole in the fridge this way for up to three days. If the guacamole develops discoloration, you can either scrape off the brown parts and discard, or stir into the rest of the guacamole before serving. +

+
+
+
+ + +
+
Elise Bauer +
+

Guacamole Variations

+

Once you have basic guacamole down, feel free to experiment with variations by adding strawberries, peaches, pineapple, mangoes, or even watermelon. One classic Mexican guacamole has pomegranate seeds and chunks of peaches in it (a Diana Kennedy favorite). You can get creative with your homemade guacamole! +

+
+
  • Simple Guacamole: The simplest version of guacamole is just mashed avocados with salt. Don't let the lack of other ingredients stop you from making guacamole.
  • Quick guacamole: For a very quick guacamole just take a 1/4 cup of salsa and mix it in with your mashed avocados.
  • Don't have enough avocados? To extend a limited supply of avocados, add sour cream, mayonnaise, or cottage cheese to your guacamole. Purists may be horrified, but so what? It still tastes great.
  • +
+
+

Even More Guacamole Recipes to Try

+ +
+
+
+ + +
+

Simply Recipes / Elise Bauer

+
+
+
+
+

How to Make the Best Guacamole +

+
+
+
+ +Prep Time +10 mins + +
+
+ +Total Time +10 mins + +
+
+
+
+ +Servings +2 +to 4 servings + +
+
+
+

Be careful handling chilis! If using, it's best to wear food-safe gloves. If no gloves are available, wash your hands thoroughly after handling, and do not touch your eyes or the area near your eyes for several hours afterwards.

+
+
+ +Keep Screen Awake + +
+

Ingredients

+
+
    +
  • +

    2 ripe avocados

    +
  • +
  • +

    1/4 teaspoon kosher salt, plus more to taste

    +
  • +
  • +

    1 tablespoon fresh lime or lemon juice

    +
  • +
  • +

    2 to 4 tablespoons minced red onion or thinly sliced green onion

    +
  • +
  • +

    1 to 2 serrano (or jalapeño) chilis, stems and seeds removed, minced

    +
  • +
  • +

    2 tablespoons cilantro (leaves and tender stems), finely chopped

    +
  • +
  • +

    Pinch freshly ground black pepper

    +
  • +
  • +

    1/2 ripe tomato, chopped (optional)

    +
  • +
  • +

    Red radish or jicama slices for garnish (optional)

    +
  • +
  • +

    Tortilla chips, to serve

    +
  • +
+
+
+
+
+
+
+

Method

+
    +
  1. +
    Cut the avocados:
    +

    Cut the avocados in half. Remove the pit. Score the inside of the avocado with a blunt knife and scoop out the flesh with a spoon. (See How to Cut and Peel an Avocado.) Place in a bowl. +

    +
    +
    + + +
    +
    Elise Bauer +
    +
    +
  2. +
  3. +
    Mash the avocado flesh:
    +

    Using a fork, roughly mash the avocado. Don't overdo it! The guacamole should be a little chunky. +

    +
    +
    + + +
    +
    Elise Bauer +
    +
    +
  4. +
  5. +
    Add the remaining ingredients to taste:
    +

    Sprinkle with salt and lime (or lemon) juice. The acid in the lime juice will provide some balance to the richness of the avocado and will help delay the avocados from turning brown. +

    +

    Add the chopped onion, cilantro, black pepper, and chilis. Chili peppers vary individually in their spiciness. So, start with a half of one chili pepper and add more to the guacamole to your desired degree of heat. +

    +

    Remember that much of this is done to taste because of the variability in the fresh ingredients. Start with this recipe and adjust to your taste. +

    +
    +
  6. +
  7. +
    Serve immediately:
    +

    If making a few hours ahead, place plastic wrap on the surface of the guacamole and press down to cover it to prevent air reaching it. (The oxygen in the air causes oxidation which will turn the guacamole brown.) +

    +

    Garnish with slices of red radish or jicama strips. Serve with your choice of store-bought tortilla chips or make your own homemade tortilla chips. +

    +

    Refrigerate leftover guacamole up to 3 days. +

    +

    Note: Chilling tomatoes dulls their flavor. So, if you want to add chopped tomato to your guacamole, add just before serving. +

    +

    Did you love the recipe? Let us know with a rating and review! +

    +
    +
  8. +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Nutrition Facts (per serving)
252Calories
22g Fat
16g Carbs
3g Protein
+
+
+
×
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nutrition Facts
Servings: 2 +to 4
Amount per serving
Calories252
% Daily Value*
Total Fat 22g28%
Saturated Fat 3g16%
Cholesterol 0mg0%
Sodium 144mg6%
Total Carbohydrate 16g6%
Dietary Fiber 11g38%
Total Sugars 2g
Protein 3g
Vitamin C 18mg89%
Calcium 28mg2%
Iron 1mg6%
Potassium 784mg17%
*The % Daily Value (DV) tells you how much a nutrient in a food serving contributes to a daily diet. 2,000 calories a day is used for general nutrition advice.
+
+
+
Nutrition information is calculated using an ingredient database and should be considered an estimate. In cases where multiple ingredient alternatives are given, the first listed is calculated for nutrition. Garnishes and optional ingredients are not included.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.meta.json b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.meta.json new file mode 100644 index 0000000..fe04ff0 --- /dev/null +++ b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.meta.json @@ -0,0 +1,12 @@ +{ + "url": "https://www.simplyrecipes.com/recipes/perfect_guacamole/", + "fetched_at": "2025-11-04T07:23:56.744212+00:00", + "status": 200, + "final_url": "https://www.simplyrecipes.com/recipes/perfect_guacamole/", + "error": null, + "profile": "automation", + "content_type": "text/html;charset=utf-8", + "content_encoding": "gzip", + "candidate": "https://www.simplyrecipes.com/recipes/perfect_guacamole/", + "request_headers": "{\"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"en-US,en;q=0.8\", \"Accept-Encoding\": \"gzip, deflate\", \"Connection\": \"keep-alive\", \"User-Agent\": \"MunchEaseRecipeBot/1.0 (+https://example.com/bot)\", \"From\": \"bot@example.com\"}" +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.recipe.json b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.recipe.json new file mode 100644 index 0000000..a2f8f55 --- /dev/null +++ b/tests/sample_files/recipes/www.simplyrecipes.com-recipes-perfect_guacamole.recipe.json @@ -0,0 +1,161 @@ +{ + "id": -1, + "name": "How to Make the Best Guacamole", + "link": "https://www.simplyrecipes.com/recipes/perfect_guacamole/", + "serves": 4, + "imageUrls": [ + "https://www.simplyrecipes.com/thmb/J4kA2m6jKMgkQwZhG-RYpjZBeFQ=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/Guacamole-LEAD-6-2-64cfcca253c8421dad4e3fad830219f6.jpg" + ], + "ingredients": [ + { + "id": -1, + "name": "ripe avocados", + "line": "2 ripe avocados", + "unit": "Items", + "quantity": 2.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "salt", + "line": "1/4 teaspoon salt, plus more to taste", + "unit": "Teaspoon", + "quantity": 0.25, + "preparation": "", + "productId": 5, + "recipeId": null, + "mealId": null, + "product": { + "id": 5, + "productId": "33245", + "shopCode": "woolworths", + "link": "https://www.woolworths.com.au/shop/productdetails/33245/saxa-iodised-table-salt-shaker", + "name": "Saxa Iodised Table Salt Shaker", + "quantity": 750, + "unit": "g", + "imgSmall": "https://cdn0.woolworths.media/content/wowproductimages/small/033245.jpg", + "imgLarge": "https://cdn0.woolworths.media/content/wowproductimages/large/033245.jpg" + } + }, + { + "id": -1, + "name": "fresh lime or lemon juice", + "line": "1 tablespoon fresh lime or lemon juice", + "unit": "Tablespoon", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "red onion or thinly sliced green onion", + "line": "2-4 tablespoons minced red onion or thinly sliced green onion", + "unit": "Tablespoon", + "quantity": 2.0, + "preparation": "minced", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "serrano (or jalapeño) chiles", + "line": "1-2 serrano (or jalapeño) chiles, stems and seeds removed, minced", + "unit": "Items", + "quantity": 1.0, + "preparation": "stems and seeds removed, minced", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "cilantro", + "line": "2 tablespoons cilantro (leaves and tender stems), finely chopped", + "unit": "Tablespoon", + "quantity": 2.0, + "preparation": "finely chopped", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "black pepper", + "line": "Pinch freshly ground black pepper", + "unit": "Items", + "quantity": 1.0, + "preparation": "freshly ground", + "productId": 6, + "recipeId": null, + "mealId": null, + "product": { + "id": 6, + "productId": "75194", + "shopCode": "woolworths", + "link": "https://www.woolworths.com.au/shop/productdetails/75194/mckenzie-s-pepper-black-ground", + "name": "Mckenzie's Pepper Black Ground", + "quantity": 100, + "unit": "g", + "imgSmall": "https://cdn0.woolworths.media/content/wowproductimages/small/075194.jpg", + "imgLarge": "https://cdn0.woolworths.media/content/wowproductimages/large/075194.jpg" + } + }, + { + "id": -1, + "name": "ripe tomato", + "line": "1/2 ripe tomato, chopped (optional)", + "unit": "Items", + "quantity": 0.5, + "preparation": "chopped", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "Red radish or jicama slices", + "line": "Red radish or jicama slices for garnish (optional)", + "unit": "Items", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "Tortilla chips", + "line": "Tortilla chips , to serve", + "unit": "Items", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + } + ], + "basedOnRecipe": null, + "dateCreated": "2025-11-04T18:24:30.070234+11:00", + "createdById": 1, + "createdBy": { + "id": 1, + "displayName": "Snapshot Generator" + }, + "dateHidden": null, + "hiddenById": null, + "hiddenBy": null +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.taste.com.au-classic-chewy-brownie-f0960a83-1fa9-4e3e-b616-a995182613e0.meta.json b/tests/sample_files/recipes/www.taste.com.au-classic-chewy-brownie-f0960a83-1fa9-4e3e-b616-a995182613e0.meta.json new file mode 100644 index 0000000..f84a9a2 --- /dev/null +++ b/tests/sample_files/recipes/www.taste.com.au-classic-chewy-brownie-f0960a83-1fa9-4e3e-b616-a995182613e0.meta.json @@ -0,0 +1,12 @@ +{ + "url": "https://www.taste.com.au/recipes/classic-chewy-brownie/f0960a83-1fa9-4e3e-b616-a995182613e0", + "fetched_at": "2025-11-04T07:23:56.581964+00:00", + "status": 403, + "final_url": "http://www.taste.com.au/recipes/classic-chewy-brownie/f0960a83-1fa9-4e3e-b616-a995182613e0/amp", + "error": "SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate (_ssl.c:1016)", + "profile": "edge-desktop", + "content_type": "text/html", + "content_encoding": null, + "candidate": "http://www.taste.com.au/recipes/classic-chewy-brownie/f0960a83-1fa9-4e3e-b616-a995182613e0/amp", + "request_headers": "{\"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"en-US,en;q=0.8\", \"Accept-Encoding\": \"gzip, deflate\", \"Connection\": \"keep-alive\", \"User-Agent\": \"MunchEaseRecipeBot/1.0 (+https://example.com/bot)\", \"From\": \"bot@example.com\"}" +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.html b/tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.html new file mode 100644 index 0000000..b398b65 --- /dev/null +++ b/tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.html @@ -0,0 +1,398 @@ +Chicken Tamale Pie Recipe | The Kitchn

Cheesy Chicken Tamale Pie

Laura Rege
Laura Rege
Laura Rege is a recipe developer and food stylist living the mid-coastal lifestyle between Dallas and Brooklyn. Formerly a senior member of the editorial teams at Food & Wine and Martha Stewart Living, Laura now creates and styles recipes for websites like ours and cooking…read more
Patty CatalanoFood Editor
Patty CatalanoFood Editor
At The Kitchn, I develop all of your favorite recipes and help you discover your most beloved grocery finds. I have more than 17 years of recipe development experience, including time spent in cookbook test kitchens and on Alton Brown’s culinary team. My two kids have lots of opinions on dinner.
published 1 day ago
thanksgiving
Baked dish in a cast iron skillet topped with melted cheese and green onion slices.
Credit: Photo: Ryan Liebe; Food Styling: Jason Schreiber

This super-satisfying, one-pan dinner comes together in under an hour.

Serves4 to 6

Prep25 minutes

Cook30 minutes

Cook Mode+
Jump to Recipe
We independently select these products—if you buy from one of our links, we may earn a commission. All prices were accurate at the time of publishing.
Baked dish in a cast iron skillet topped with melted cheese and green onion slices.
Credit: Photo: Ryan Liebe; Food Styling: Jason Schreiber

Meet chicken tamale pie — a tamale meets cornbread casserole that’s perfect for weeknights. A golden layer of tender cornbread bakes right in a skillet, forming a delicious crust that’s topped with a corn-studded, red chicken enchilada filling and plenty of melty cheese. The result is a cheesy one-pan meal that’s super satisfying.

This casserole with Southern roots has regional and ingredient variations, much like tamales themselves. I like to add a kick to my tamale pies with pickled jalapeños and frozen roasted corn — a nod to the flavors I came to love during my years in Texas. This skillet dinner is true comfort food, and it’s made with smart shortcuts that keep it simple and straightforward — just the way a good casserole should be. If you love it, try our easy skillet tamale pie made with ground beef, too.

Why You’ll Love It

    +
  • One-skillet weeknight dinner. With the help of rotisserie chicken and corn muffin mix, everything comes together in under an hour in a single pan. No rolling or wrapping required (unlike traditional tamales).
  • + + + +
  • All the comfort of tamales; none of the work. This Southern-style bake brings you everything you love about tamales — the bold flavors, the saucy filling, the sweet corn base — without the hours of prep, corn husks, or steaming.
  • +
Credit: Photo: Ryan Liebe; Food Styling: Jason Schreiber

Key Ingredients in Chicken Tamale Pie

    +
  • Corn muffin mix: A box of Jiffy keeps things quick and delivers that sweet-savory flavor we love in classic tamales.
  • + + + +
  • Rotisserie chicken: Store-bought cooked chicken saves major time while still offering great texture and flavor.
  • + + + +
  • Enchilada sauce: Use your favorite canned version or homemade — either way, this tomato-based sauce blends together the flavors of the dish.
  • + + + +
  • Pickled jalapeños: Instead of the more typical can of green chiles, I prefer stirring chopped pickled jalapeños into the chicken mixture for a tangy kick and brighter note.
  • + + + +
  • Fire-roasted corn: Sweet and just a touch smokier than your average frozen corn, this ingredient adds another flavor note and texture to both the cornbread base and the filling.
  • + + + +
  • Cheese: A blend of sharp cheddar and Monterey Jack cheese gives you that perfect gooey finish.
  • +

How to Make Chicken Tamale Pie

    +
  1. Bake the cornbread. Melt butter right in a cast iron skillet and swirl to coat the bottom. Fill with the prepared cornbread batter, then bake until golden and just set.
  2. + + + +
  3. Cook the chicken filling. While the cornbread bakes, sauté scallions and garlic with chili powder and cumin, then stir in shredded chicken, enchilada sauce, corn, and pickled jalapeños.
  4. + + + +
  5. Layer it up. Once the cornbread is out, spoon the chicken mixture on top, and cover the casserole with a combo of cheddar and Monterey Jack cheese.
  6. + + + +
  7. Melt the cheese. Pop it back in the oven until it’s bubbling and the cheese is browned in spots.
  8. + + + +
  9. Serve. Let it cool slightly, top with fresh scallions, and serve with extra sour cream and pickled jalapeños if desired.
  10. +

Helpful Swaps

    +
  • No rotisserie chicken? Use any leftover shredded chicken or even shredded slow cooked pork or beef, like pork carnitas or beer-braised brisket
  • + + + +
  • Want it vegetarian? Skip the meat and bulk it up with black beans or sautéed mushrooms.
  • + + + +
  • If two types of melty cheese feel like overkill, use just one or opt for a pre-shredded Mexican blend from the grocery store for convenience.
  • + + + +
  • Try pickled jalapeños for a fresh, modern spin on canned green chiles. These add a touch of acidity and gentle heat. For a milder option, use chopped, drained roasted red bell peppers instead.
  • + + + +
  • Can’t find frozen fire-roasted corn? Regular frozen works just fine. Fresh corn removed from the cob can also be used as a substitute. 
  • +

Storage and Make-Ahead Tips 

Leftovers keep well in the fridge for up to 4 days. Reheat right in the skillet in the oven or by the slice in a microwave.

What to Serve with Chicken Tamale Pie

This skillet is a meal on its own, but a few simple sides make it dinner-party-worthy.

Tips from Our Recipe Tester

This was very good and surprising! I’ve had similar recipes before where the filling is topped with cornbread, but I loved how adding the filling on top kept the cornbread tender and moist. The cheesy layer was deliciously browned and gooey. Using the 9-inch pie pan worked well. My son said, “You gotta make that again.” Patty, September 2025

Chicken Tamale Pie Recipe

This super-satisfying, one-pan dinner comes together in under an hour.

Prep time 25 minutes

Cook time 30 minutes

Serves 4 to 6

Nutritional Info

Ingredients

  • 3 tablespoons

    unsalted butter, divided

  • 1 (8.5-ounce) box

    corn muffin mix, such as Jiffy

  • 1

    large egg

  • 1/2 cup

    sour cream, plus more for serving

  • 4

    medium scallions, thinly sliced (about 1/2 cup), plus more for garnish

  • 2 cloves

    garlic, minced

  • 2 teaspoons

    chili powder

  • 1/2 teaspoon

    ground cumin

  • 3 cups

    shredded, cooked chicken (from 1/2 rotisserie chicken, about 10 ounces)

  • 1 (10-ounce) can

    red enchilada sauce, or 1 1/4 cups homemade enchilada sauce

  • 1 cup

    frozen corn kernels, preferably fire-roasted (do not thaw)

  • 1/2 cup

    drained sliced pickled jalapeños, coarsely chopped, plus more for serving

  • 4 ounces

    sharp cheddar cheese, shredded (about 1 cup)

  • 4 ounces

    shredded Monterey Jack cheese, shredded (about 1 cup)

Instructions

  1. Heat the oven to 425°F. Melt 1 tablespoon of the unsalted butter in a 10-inch cast iron or other oven-safe, high-sided skillet over medium heat, swirling to coat the bottom and sides, about 1 minute. Remove from the heat.

  2. Stir 1 (8.5-ounce) box corn muffin mix, 1 large egg, and 1/2 cup sour cream together in a medium bowl until just combined. Spoon the batter into the skillet and use the back of a knife or offset spatula to spread into an even layer. Bake until the cornbread is just set, 8 to 10 minutes. Remove from the oven.

  3. While the cornbread is baking, melt the remaining 2 tablespoons unsalted butter in a large skillet over medium heat. Add 4 thinly sliced medium scallions and 2 minced garlic cloves. Cook, stirring occasionally, until fragrant and the garlic is starting to turn brown, 1 to 2 minutes. Stir in 2 teaspoons chili powder and 1/2 teaspoon ground cumin and cook, stirring often, until fragrant, about 30 seconds.

  4. Stir in 10 ounces shredded, cooked chicken, 1 (10-ounce) can red enchilada sauce, 1 cup frozen corn kernels, and 1/2 cup chopped pickled jalapeños. Bring to a boil. Remove from the heat until the cornbread is ready.

  5. Spoon the chicken mixture, including the sauce, evenly over the cornbread. Sprinkle evenly with 4 ounces shredded sharp cheddar cheese and 4 ounces shredded Monterey Jack cheese.

  6. Return the skillet to the oven. Bake until the filling is bubbling and the cheese is melted and browned in spots, about 15 minutes more. Let cool for 10 minutes before serving. Garnish with more thinly sliced scallions. Serve with more sour cream and pickled jalapeños if desired.

Recipe Notes

Ingredient/equipment variations

  • A 9-inch round cake pan can be used in place of the skillet in Step 1. Place 1 tablespoon of the unsalted butter in the pan and heat in the oven until melted. Swirl the pan to coat the bottom and sides before proceeding with Step 2.
  • The pickled jalapeños can be substituted with 1 (4-ounce) can drained chopped green chiles or 1/2 cup chopped roasted red bell pepper for a more mild flavor.

Make ahead: The cornbread can be made up to 2 days ahead. Let it cool completely in the skillet, then wrap tightly in plastic wrap or aluminum foil and store at room temperature.

Storage: Leftovers can be refrigerated in an airtight container for up to 4 days.

More to Love from The Kitchn

\ No newline at end of file diff --git a/tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.meta.json b/tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.meta.json new file mode 100644 index 0000000..469f8ac --- /dev/null +++ b/tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.meta.json @@ -0,0 +1,12 @@ +{ + "url": "https://www.thekitchn.com/chicken-tamale-pie-23752740", + "fetched_at": "2025-11-04T07:23:56.686401+00:00", + "status": 200, + "final_url": "https://www.thekitchn.com/chicken-tamale-pie-23752740", + "error": null, + "profile": "automation", + "content_type": "text/html; charset=utf-8", + "content_encoding": "gzip", + "candidate": "https://www.thekitchn.com/chicken-tamale-pie-23752740", + "request_headers": "{\"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\", \"Accept-Language\": \"en-US,en;q=0.8\", \"Accept-Encoding\": \"gzip, deflate\", \"Connection\": \"keep-alive\", \"User-Agent\": \"MunchEaseRecipeBot/1.0 (+https://example.com/bot)\", \"From\": \"bot@example.com\"}" +} \ No newline at end of file diff --git a/tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.recipe.json b/tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.recipe.json new file mode 100644 index 0000000..01622fb --- /dev/null +++ b/tests/sample_files/recipes/www.thekitchn.com-chicken-tamale-pie-23752740.recipe.json @@ -0,0 +1,211 @@ +{ + "id": -1, + "name": "Cheesy Chicken Tamale Pie", + "link": "https://www.thekitchn.com/chicken-tamale-pie-23752740", + "serves": 6, + "imageUrls": [ + "https://cdn.apartmenttherapy.info/image/upload/f_jpg,q_auto:eco,c_fill,g_auto,w_1500,ar_16:9/tk%2Fphoto%2F2025%2F10-2025%2F2025-10-chicken-tamale-pie%2Fchicken-tamale-pie-0", + "https://cdn.apartmenttherapy.info/image/upload/f_jpg,q_auto:eco,c_fill,g_auto,w_1500,ar_4:3/tk%2Fphoto%2F2025%2F10-2025%2F2025-10-chicken-tamale-pie%2Fchicken-tamale-pie-0", + "https://cdn.apartmenttherapy.info/image/upload/f_jpg,q_auto:eco,c_fill,g_auto,w_1500,ar_1:1/tk%2Fphoto%2F2025%2F10-2025%2F2025-10-chicken-tamale-pie%2Fchicken-tamale-pie-0" + ], + "ingredients": [ + { + "id": -1, + "name": "unsalted butter", + "line": "3 tablespoons unsalted butter, divided", + "unit": "Tablespoon", + "quantity": 3.0, + "preparation": "divided", + "productId": 4, + "recipeId": null, + "mealId": null, + "product": { + "id": 4, + "productId": "712251", + "shopCode": "woolworths", + "link": "https://www.woolworths.com.au/shop/productdetails/712251/western-star-unsalted-butter-chef-s-choice", + "name": "Western Star Unsalted Butter Chef's Choice", + "quantity": 500, + "unit": "g", + "imgSmall": "https://cdn0.woolworths.media/content/wowproductimages/small/712251.jpg", + "imgLarge": "https://cdn0.woolworths.media/content/wowproductimages/large/712251.jpg" + } + }, + { + "id": -1, + "name": "corn muffin mix", + "line": "1 (8.5-ounce) box corn muffin mix, such as Jiffy", + "unit": "Ounce", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "egg", + "line": "1 large egg", + "unit": "Items", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "sour cream", + "line": "1/2 cup sour cream, plus more for serving", + "unit": "Cup", + "quantity": 0.5, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "scallions", + "line": "4 medium scallions, thinly sliced (about 1/2 cup), plus more for garnish", + "unit": "Cup", + "quantity": 4.0, + "preparation": "thinly sliced", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "garlic", + "line": "2 cloves garlic, minced", + "unit": "Items", + "quantity": 2.0, + "preparation": "minced", + "productId": 2, + "recipeId": null, + "mealId": null, + "product": { + "id": 2, + "productId": "294517", + "shopCode": "woolworths", + "link": "https://www.woolworths.com.au/shop/productdetails/294517/la-famiglia-garlic-bread", + "name": "La Famiglia Garlic Bread", + "quantity": 1, + "unit": "Loaf", + "imgSmall": "https://cdn0.woolworths.media/content/wowproductimages/small/294517.jpg", + "imgLarge": "https://cdn0.woolworths.media/content/wowproductimages/large/294517.jpg" + } + }, + { + "id": -1, + "name": "chili powder", + "line": "2 teaspoons chili powder", + "unit": "Teaspoon", + "quantity": 2.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "ground cumin", + "line": "1/2 teaspoon ground cumin", + "unit": "Teaspoon", + "quantity": 0.5, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "chicken", + "line": "3 cups shredded, cooked chicken (from 1/2 rotisserie chicken, about 10 ounces)", + "unit": "Cup", + "quantity": 3.0, + "preparation": "shredded, cooked", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "red enchilada sauce", + "line": "1 (10-ounce) can red enchilada sauce, or 1 1/4 cups homemade enchilada sauce", + "unit": "Ounce", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "frozen corn kernels", + "line": "1 cup frozen corn kernels, preferably fire-roasted (do not thaw)", + "unit": "Cup", + "quantity": 1.0, + "preparation": "", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "pickled jalapeños", + "line": "1/2 cup drained sliced pickled jalapeños, coarsely chopped, plus more for serving", + "unit": "Cup", + "quantity": 0.5, + "preparation": "drained sliced, coarsely chopped", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "sharp cheddar cheese", + "line": "4 ounces sharp cheddar cheese, shredded (about 1 cup)", + "unit": "Ounce", + "quantity": 4.0, + "preparation": "shredded", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + }, + { + "id": -1, + "name": "Monterey Jack cheese", + "line": "4 ounces shredded Monterey Jack cheese, shredded (about 1 cup)", + "unit": "Ounce", + "quantity": 4.0, + "preparation": "shredded", + "productId": -1, + "recipeId": null, + "mealId": null, + "product": null + } + ], + "basedOnRecipe": null, + "dateCreated": "2025-11-04T18:24:30.117818+11:00", + "createdById": 1, + "createdBy": { + "id": 1, + "displayName": "Snapshot Generator" + }, + "dateHidden": null, + "hiddenById": null, + "hiddenBy": null +} \ No newline at end of file diff --git a/tests/test_recipes_offline_expected.py b/tests/test_recipes_offline_expected.py new file mode 100644 index 0000000..da09245 --- /dev/null +++ b/tests/test_recipes_offline_expected.py @@ -0,0 +1,92 @@ +import asyncio +import json +from pathlib import Path +from types import SimpleNamespace + +import pytest + +from db import connect, create +from recipes import parse_recipe_from_html + + +SNAP_DIR = Path("tests/sample_files/recipes") + + +def _iter_expected_files(): + return sorted(SNAP_DIR.glob("*.recipe.json")) + + +def _load_expected(path: Path): + # New-style file contains the model JSON directly or null + return json.loads(path.read_text()) + + +def _expected_subset(expected: dict): + # expected is serialized with by_alias=True, so image_urls is imageUrls + name = expected.get("name") + link = expected.get("link") + serves = expected.get("serves") + image_urls = expected.get("imageUrls") or [] + ingredients = expected.get("ingredients") or [] + ing_lines = [ing.get("line") for ing in ingredients] + return { + "name": name, + "link": link, + "serves": serves, + "image_urls": image_urls, + "ingredient_lines": ing_lines, + } + + +def _actual_subset(model): + # Stable, assertion-friendly projection + return { + "name": model.name, + "link": model.link, + "serves": model.serves, + "image_urls": list(model.image_urls or []), + "ingredient_lines": [ing.line for ing in (model.ingredients or [])], + } + + +@pytest.mark.parametrize("exp_path", _iter_expected_files()) +def test_offline_parse_matches_expected(exp_path: Path): + async def _run(): + slug = exp_path.stem + expected = _load_expected(exp_path) + + html_path = SNAP_DIR / f"{slug}.html" + assert html_path.exists(), f"snapshot HTML missing for {slug}" + html = html_path.read_text() + + # Discover base URL from meta if available + meta_path = SNAP_DIR / f"{slug}.meta.json" + base_url = slug + if meta_path.exists(): + try: + meta = json.loads(meta_path.read_text()) + base_url = meta.get("final_url") or meta.get("url") or slug + except Exception: + pass + + created_by = SimpleNamespace(id=1, display_name="Snapshot Generator") + conn = await connect() + await create(conn) + try: + model = await parse_recipe_from_html(conn, created_by, base_url, html) + finally: + await conn.close() + + if expected is None: + assert model is None, f"expected no parse for {slug}, but got a model" + return + + assert model is not None, f"expected a model for {slug}, got None" + + exp_sub = _expected_subset(expected) + act_sub = _actual_subset(model) + + # Compare key fields; ingredients compare by line only for stability + assert act_sub == exp_sub + + asyncio.run(_run()) diff --git a/tests/test_recipes_parse_from_url_integration_v2.py b/tests/test_recipes_parse_from_url_integration_v2.py index ded0637..28285fa 100644 --- a/tests/test_recipes_parse_from_url_integration_v2.py +++ b/tests/test_recipes_parse_from_url_integration_v2.py @@ -50,6 +50,8 @@ class TestRecipesParseFromUrlIntegrationV2(unittest.IsolatedAsyncioTestCase): self.text = text class DummyClient: + def __init__(self, *args, **kwargs): + pass async def __aenter__(self): return self @@ -90,6 +92,8 @@ class TestRecipesParseFromUrlIntegrationV2(unittest.IsolatedAsyncioTestCase): self.text = text class DummyClient: + def __init__(self, *args, **kwargs): + pass async def __aenter__(self): return self @@ -127,6 +131,8 @@ class TestRecipesParseFromUrlIntegrationV2(unittest.IsolatedAsyncioTestCase): self.text = text class DummyClient: + def __init__(self, *args, **kwargs): + pass async def __aenter__(self): return self diff --git a/tests/test_recipes_parse_from_url_v2.py b/tests/test_recipes_parse_from_url_v2.py index accd907..ac6a672 100644 --- a/tests/test_recipes_parse_from_url_v2.py +++ b/tests/test_recipes_parse_from_url_v2.py @@ -40,11 +40,11 @@ class TestRecipesParseFromUrlV2(unittest.IsolatedAsyncioTestCase): # Monkeypatch scraper to avoid network import recipes.scraping as scraping - async def fake_scrape(url: str): + async def fake_scrape(url: str, log=None, dump_dir=None): assert url == "https://example.com/recipe" return {"@type": "Recipe", "name": "Example", "recipeIngredient": ["2 eggs"]} - async def fake_scrape_none(url: str): + async def fake_scrape_none(url: str, log=None, dump_dir=None): return None # Success case