diff --git a/README.rst b/README.rst index dc117ad9d..0da9bdaf2 100644 --- a/README.rst +++ b/README.rst @@ -198,6 +198,7 @@ Scrapers available for: - `https://littlespicejar.com/ `_ - `http://livelytable.com/ `_ - `https://lovingitvegan.com/ `_ +- `https://www.maangchi.com `_ - `https://madensverden.dk/ `_ - `https://www.madewithlau.com/ `_ - `https://marleyspoon.com.au/ `_ diff --git a/recipe_scrapers/__init__.py b/recipe_scrapers/__init__.py index ebf827039..b57577d4b 100644 --- a/recipe_scrapers/__init__.py +++ b/recipe_scrapers/__init__.py @@ -120,6 +120,7 @@ from .littlespicejar import LittleSpiceJar from .livelytable import LivelyTable from .lovingitvegan import Lovingitvegan +from .maangchi import Maangchi from .madensverden import MadensVerden from .madewithlau import MadeWithLau from .marleyspoon import MarleySpoon @@ -340,6 +341,7 @@ LittleSpiceJar.host(): LittleSpiceJar, LivelyTable.host(): LivelyTable, Lovingitvegan.host(): Lovingitvegan, + Maangchi.host(): Maangchi, MadensVerden.host(): MadensVerden, MadeWithLau.host(): MadeWithLau, MarleySpoon.host(): MarleySpoon, diff --git a/recipe_scrapers/maangchi.py b/recipe_scrapers/maangchi.py new file mode 100644 index 000000000..77083e89f --- /dev/null +++ b/recipe_scrapers/maangchi.py @@ -0,0 +1,52 @@ +# mypy: allow-untyped-defs + +from ._abstract import AbstractScraper +from ._utils import normalize_string + + +class Maangchi(AbstractScraper): + @classmethod + def host(cls): + return "maangchi.com" + + def author(self): + return self.schema.author() + + def title(self): + return self.schema.title() + + def category(self): + return self.schema.category() + + def yields(self): + return self.schema.yields() + + def image(self): + return self.schema.image() + + def ingredients(self): + before = self.soup.find("h4", string="Directions").find_all_previous("li") + after = self.soup.find("h4", string="Ingredients:").find_all_next("li") + lstBfr = [normalize_string(b.get_text()) for b in before] + lstAfr = [normalize_string(a.get_text()) for a in after] + lstBfr.reverse() + return [x for x in lstBfr if x in lstAfr] + + def instructions(self): + ols = self.soup.find("div", {"class": "entry"}).find_all("ol") + instructions = [] + for ol in ols: + for li in ol.findAll("li"): + instructions.append(li) + return "\n".join( + [normalize_string(instruction.get_text()) for instruction in instructions] + ) + + def ratings(self): + return self.schema.ratings() + + def cuisine(self): + return self.schema.cuisine() + + def description(self): + return self.schema.description() diff --git a/tests/test_data/maangchi.testhtml b/tests/test_data/maangchi.testhtml new file mode 100644 index 000000000..771546361 --- /dev/null +++ b/tests/test_data/maangchi.testhtml @@ -0,0 +1,1372 @@ + + + + Pepper fried chicken (Yuringi: 유린기) recipe by Maangchi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + + +
+
+ + + +
+ + + + + + + +

Pepper chicken

+ +

Yuringi 유린기

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

Today I’m introducing you to another Korean Chinese dish called yuringi (pronounced yu-rin-gi). It’s fried chicken with peppers and a light sweet sour sauce. A piece of crunchy chicken soaked in sweet, sour, salty sauce tastes so crispy and juicy! The chopped spicy fresh pepper served with this dish adds delightful flavor for spicy food lovers like me! It never feels greasy but rather very refreshing. This dish originated in China and is another Korean Chinese dish along with the many others I have made (see the full list of my Korean Chinese recipes here).

+

Unlike most Korean fried chicken, yuringi is served with crispy vegetables and lots of sweet, sour, salty sauce. Now, with my recipe, you can easily make it at home, And if you’d prefer to make this dish mild, use less spicy or non-spicy peppers and even green and red bell peppers instead of spicy peppers. Be sure to slice them very thinly!

+

If you have any leftovers, refrigerate them for up to 3 days and serve with rice. This dish always goes well with rice!

+

Enjoy the recipe and Happy Holidays!yuringi-pepper

+

Ingredients:

+

for 3 to 4 servings

+
    +
  • 1 pound boneless & skinless chicken thighs
  • +
  • ½ teaspoon kosher salt
  • +
  • ¼ teaspoon ground black pepper
  • +
  • 2 inch of white part of dae-pa (or 2 to 3 regular green onions), thinly sliced lengthwise
  • +
  • ¼ of small onion (about 2 tablespoons), thinly sliced
  • +
  • 2 cups grape seeds oil (or vegetable oil, corn oil) for frying
  • +
  • 4 to 5 lettuce leaves
  • +
  • 3 to 4 spicy green and red chili peppers (or non-spicy peppers, green and red bell pepper), thinly sliced
  • +
+

For sauce:

+
    +
  • 2 tablespoons grape seeds oil (or vegetable oil)
  • +
  • 1 teaspoon crushed chili pepper (or 2 small dried red chili peppers or Korean hot pepper flakes)
  • +
  • 3 tablespoons soy sauce
  • +
  • 3 tablespoons white vinegar (or apple cider vinegar)
  • +
  • 3 tablespoons Turbinado sugar (or white or brown sugar)
  • +
  • 2 tablespoons water
  • +
  • 4 garlic cloves, minced
  • +
  • 1 teaspoon toasted sesame oil
  • +
+

For batter:

+ +

Directions

+

Prepare the chicken and onions

+
    +
  1. Pat the chicken thighs dry with paper towels. Score a crosshatch patten on both sides of the chicken pieces.
  2. +
  3. Pound the thighs to an even thickness with a meat tenderizer or with the back of your kitchen knife.making yuringi
  4. +
  5. Sprinkle both sides with salt and ground black pepper.
  6. +
  7. Set aside or refrigerate until ready to use.
  8. +
  9. Place the shredded green onion and onion in a bowl and add cold water. Let it sit.
  10. +
+

Make the sauce:

+
    +
  1. Heat the vegetable oil in a small pan until it begins to smoke, about 30 seconds to 1 minute.
  2. +
  3. Remove from the heat. Stir in the pepper flakes until they are slightly brown. Strain the oil into a medium sized stainless steel bowl.pepper infused oil
  4. +
  5. Add the soy sauce, vinegar, sugar, water, garlic, and sesame oil.
  6. +
  7. Stir well until the sugar is completely dissolved.유린기 소스
  8. +
+

Make the batter:

+
    +
  1. Prepare a shallow and wide bowl (I use my large, shallow plastic bowl).
  2. +
  3. Add the starch and salt. Crack in an egg.
  4. +
  5. Mix well with a spoon or a whisk.
  6. +
+

Fry the chicken:

+
    +
  1. Heat the oil in a large, deep pan over medium-high heat until it reaches about 340° to 350° F. If you don’t have a kitchen thermometer, test the oil temperature by dipping a tip of a chicken piece into it. If it bubbles, it’s ready.
  2. +
  3. Dip a chicken piece into the batter and wipe off the excess with the side of the bowl. Add it to the oil one piece at a time, working in batches if your pan is small. My 12 inch large pan is perfect for frying 4 pieces of chicken thighs at a time. Repeat with the rest of the chicken pieces until all are in the pan.유린기
  4. +
  5. Deep-fry, turning the chicken with tongs, until all sides are light golden brown and crunchy, about 5 to 6 minutes. As each piece is done, transfer it to a strainer over a bowl to drain the excess oil.
  6. +
  7. Reheat the oil for about 1 minute and add all the chicken again. It will look a little soggy at first. Deep-fry, turning occasionally, until all the chicken pieces are dark golden brown and very crunchy, another 5 to 6 minutes.yuringi-frying
  8. +
  9. Transfer the chicken pieces to the strainer over the bowl to drain. Let them cool for a few minutes until you can handle them.fried chicken
  10. +
+

Serve:

+
    +
  1. Add the sliced chili pepper to the sauce and mix it together.
  2. +
  3. Drain the soaking green onion and onion through a strainer set in your sink. Rinse it under cold running water, turning it over by hand for 10 seconds. Drain well.
  4. +
  5. Cut the chicken into bite size pieces and put them on a large plate lined with the lettuce. Spoon the peppers out of the sauce and put them on top of the chicken.pepper chicken, cut
  6. +
  7. Add the shredded green onion and onion and gently pour the rest of the sauce all over top.
  8. +
  9. Serve right away.유린기
  10. +
+ +
+ + + +
+ +

Leave your rating:

So far this is rated 5/5 from 730 votes

Be the first to rate this.

+
+ +

5 Comments:

+
    +
  1. +
    +
    + TheTravelingFoodie San Francisco, CA joined 1/22 & has 3 comments + + +
    + +
    +

    So, I’ve been a long time follower of your website/YouTube videos and have made almost all of your recipes! I have both of your cookbooks and I am just obsessed with Korean cuisine in general! I made this one tonight and it was spectacular!

    +


    See full size image

    +
    +
    + +
  2. +
  3. +
    +
    + PoniesPonies Seattle joined 11/19 & has 7 comments + + +
    + +
    +

    Pepper Chicken was delicious! I made it for lunch today with rice and radish kimchi. I was surprised at how not messy it was to fry the chicken, my kitchen looks great and the food came together very quickly. Also super delicious. Thank you again for another lovely meal. Happy New Year, you’re the best!

    +


    See full size image

    +
    +
    + +
  4. +
+ + + +
+

Leave a Reply

+ + + +

You must create a profile and be logged in to post a comment.

+ + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/tests/test_maangchi.py b/tests/test_maangchi.py new file mode 100644 index 000000000..82b582a90 --- /dev/null +++ b/tests/test_maangchi.py @@ -0,0 +1,76 @@ +# mypy: allow-untyped-defs + +from recipe_scrapers.maangchi import Maangchi +from tests import ScraperTest + + +class TestMaangchiScraper(ScraperTest): + + scraper_class = Maangchi + + def test_host(self): + self.assertEqual("maangchi.com", self.harvester_class.host()) + + def test_author(self): + self.assertEqual(None, self.harvester_class.author()) + + def test_title(self): + self.assertEqual( + "Pepper fried chicken (Yuringi: 유린기)", self.harvester_class.title() + ) + + def test_category(self): + self.assertEqual("Main", self.harvester_class.category()) + + def test_yields(self): + self.assertEqual("4 servings", self.harvester_class.yields()) + + def test_image(self): + self.assertEqual( + "https://i.ytimg.com/vi/JhE4ToJOPcc/maxresdefault.jpg?meta=og:image", + self.harvester_class.image(), + ) + + def test_ingredients(self): + self.assertEqual( + [ + "1 pound boneless & skinless chicken thighs", + "½ teaspoon kosher salt", + "¼ teaspoon ground black pepper", + "2 inch of white part of dae-pa (or 2 to 3 regular green onions), thinly sliced lengthwise", + "¼ of small onion (about 2 tablespoons), thinly sliced", + "2 cups grape seeds oil (or vegetable oil, corn oil) for frying", + "4 to 5 lettuce leaves", + "3 to 4 spicy green and red chili peppers (or non-spicy peppers, green and red bell pepper), thinly sliced", + "2 tablespoons grape seeds oil (or vegetable oil)", + "1 teaspoon crushed chili pepper (or 2 small dried red chili peppers or Korean hot pepper flakes)", + "3 tablespoons soy sauce", + "3 tablespoons white vinegar (or apple cider vinegar)", + "3 tablespoons Turbinado sugar (or white or brown sugar)", + "2 tablespoons water", + "4 garlic cloves, minced", + "1 teaspoon toasted sesame oil", + "¼ cup potato starch", + "⅛ teaspoon kosher salt", + "1 large egg", + ], + self.harvester_class.ingredients(), + ) + + def test_instructions(self): + self.assertEqual( + "Pat the chicken thighs dry with paper towels. Score a crosshatch patten on both sides of the chicken pieces.\nPound the thighs to an even thickness with a meat tenderizer or with the back of your kitchen knife.\nSprinkle both sides with salt and ground black pepper.\nSet aside or refrigerate until ready to use.\nPlace the shredded green onion and onion in a bowl and add cold water. Let it sit.\nHeat the vegetable oil in a small pan until it begins to smoke, about 30 seconds to 1 minute.\nRemove from the heat. Stir in the pepper flakes until they are slightly brown. Strain the oil into a medium sized stainless steel bowl.\nAdd the soy sauce, vinegar, sugar, water, garlic, and sesame oil.\nStir well until the sugar is completely dissolved.\nPrepare a shallow and wide bowl (I use my large, shallow plastic bowl).\nAdd the starch and salt. Crack in an egg.\nMix well with a spoon or a whisk.\nHeat the oil in a large, deep pan over medium-high heat until it reaches about 340° to 350° F. If you don’t have a kitchen thermometer, test the oil temperature by dipping a tip of a chicken piece into it. If it bubbles, it’s ready.\nDip a chicken piece into the batter and wipe off the excess with the side of the bowl. Add it to the oil one piece at a time, working in batches if your pan is small. My 12 inch large pan is perfect for frying 4 pieces of chicken thighs at a time. Repeat with the rest of the chicken pieces until all are in the pan.\nDeep-fry, turning the chicken with tongs, until all sides are light golden brown and crunchy, about 5 to 6 minutes. As each piece is done, transfer it to a strainer over a bowl to drain the excess oil.\nReheat the oil for about 1 minute and add all the chicken again. It will look a little soggy at first. Deep-fry, turning occasionally, until all the chicken pieces are dark golden brown and very crunchy, another 5 to 6 minutes.\nTransfer the chicken pieces to the strainer over the bowl to drain. Let them cool for a few minutes until you can handle them.\nAdd the sliced chili pepper to the sauce and mix it together.\nDrain the soaking green onion and onion through a strainer set in your sink. Rinse it under cold running water, turning it over by hand for 10 seconds. Drain well.\nCut the chicken into bite size pieces and put them on a large plate lined with the lettuce. Spoon the peppers out of the sauce and put them on top of the chicken.\nAdd the shredded green onion and onion and gently pour the rest of the sauce all over top.\nServe right away.", + self.harvester_class.instructions(), + ) + + def test_ratings(self): + self.assertEqual(5.0, self.harvester_class.ratings()) + + def test_cuisine(self): + self.assertEqual("Korean", self.harvester_class.cuisine()) + + def test_description(self): + self.assertEqual( + "Today I'm introducing you to another Korean Chinese dish called yuringi (pronounced yu-rin-gi). It's fried chicken with peppers and a light sweet sour sauce. A piece of crunchy chicken soaked in sweet, sour, salty sauce tastes so crispy and juicy! The chopped spicy fresh pepper served with this...", + self.harvester_class.description(), + )