recipe_scrapers 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/README.md +28 -8
- data/lib/recipe_scrapers/parsers/vocabulary/de.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/en.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/es.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/fr.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/hu.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/it.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/nl.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/pt.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/ru.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/scandinavian.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/sk.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary/tr.yml +1 -0
- data/lib/recipe_scrapers/parsers/vocabulary.rb +20 -11
- data/lib/recipe_scrapers/scraper.rb +7 -3
- data/lib/recipe_scrapers/sites/at/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/at/hofer.rb +3 -0
- data/lib/recipe_scrapers/sites/au/aldi.rb +3 -0
- data/lib/recipe_scrapers/sites/au/donnahay.rb +7 -0
- data/lib/recipe_scrapers/sites/au/gourmettraveller.rb +3 -0
- data/lib/recipe_scrapers/sites/au/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/au/juliegoodwin.rb +7 -0
- data/lib/recipe_scrapers/sites/au/taste.rb +3 -0
- data/lib/recipe_scrapers/sites/au/womensweeklyfood.rb +3 -0
- data/lib/recipe_scrapers/sites/be/dagelijksekost.rb +3 -0
- data/lib/recipe_scrapers/sites/be/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/ca/eggs.rb +3 -0
- data/lib/recipe_scrapers/sites/ca/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/ch/aldi_suisse.rb +3 -0
- data/lib/recipe_scrapers/sites/ch/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/com/101cookbooks.rb +3 -0
- data/lib/recipe_scrapers/sites/com/177milkstreet.rb +3 -0
- data/lib/recipe_scrapers/sites/com/30seconds.rb +3 -0
- data/lib/recipe_scrapers/sites/com/aberlehome.rb +3 -0
- data/lib/recipe_scrapers/sites/com/acouplecooks.rb +3 -0
- data/lib/recipe_scrapers/sites/com/adrianasbestrecipes.rb +3 -0
- data/lib/recipe_scrapers/sites/com/afarmgirlsdabbles.rb +3 -0
- data/lib/recipe_scrapers/sites/com/africanbites.rb +3 -0
- data/lib/recipe_scrapers/sites/com/alisoneroman.rb +3 -0
- data/lib/recipe_scrapers/sites/com/allsavoryrecipes.rb +3 -0
- data/lib/recipe_scrapers/sites/com/amazingoriental.rb +8 -0
- data/lib/recipe_scrapers/sites/com/ambitiouskitchen.rb +3 -0
- data/lib/recipe_scrapers/sites/com/ameessavorydish.rb +3 -0
- data/lib/recipe_scrapers/sites/com/americastestkitchen.rb +3 -0
- data/lib/recipe_scrapers/sites/com/archanaskitchen.rb +3 -0
- data/lib/recipe_scrapers/sites/com/bakeitwithlove.rb +3 -0
- data/lib/recipe_scrapers/sites/com/barefootcontessa.rb +7 -0
- data/lib/recipe_scrapers/sites/com/bigoven.rb +6 -0
- data/lib/recipe_scrapers/sites/com/bongeats.rb +6 -0
- data/lib/recipe_scrapers/sites/com/brewersfriend.rb +3 -0
- data/lib/recipe_scrapers/sites/com/carriesexperimentalkitchen.rb +3 -0
- data/lib/recipe_scrapers/sites/com/cdkitchen.rb +3 -0
- data/lib/recipe_scrapers/sites/com/chefjeanpierre.rb +3 -0
- data/lib/recipe_scrapers/sites/com/chefnini.rb +3 -0
- data/lib/recipe_scrapers/sites/com/cleaneatingkitchen.rb +3 -0
- data/lib/recipe_scrapers/sites/com/colleenchristensennutrition.rb +3 -0
- data/lib/recipe_scrapers/sites/com/comidinhasdochef.rb +3 -0
- data/lib/recipe_scrapers/sites/com/cookomix.rb +3 -0
- data/lib/recipe_scrapers/sites/com/corriecooks.rb +3 -0
- data/lib/recipe_scrapers/sites/com/culinaryhill.rb +3 -0
- data/lib/recipe_scrapers/sites/com/dinnerthendessert.rb +3 -0
- data/lib/recipe_scrapers/sites/com/donalskehan.rb +7 -0
- data/lib/recipe_scrapers/sites/com/drizzleanddip.rb +3 -0
- data/lib/recipe_scrapers/sites/com/eatwell101.rb +3 -0
- data/lib/recipe_scrapers/sites/com/empirecipes.rb +3 -0
- data/lib/recipe_scrapers/sites/com/en.rb +3 -0
- data/lib/recipe_scrapers/sites/com/epicurious.rb +3 -0
- data/lib/recipe_scrapers/sites/com/ethanchlebowski.rb +3 -0
- data/lib/recipe_scrapers/sites/com/fitmencook.rb +3 -0
- data/lib/recipe_scrapers/sites/com/gesund_aktiv.rb +3 -0
- data/lib/recipe_scrapers/sites/com/goldnplump.rb +3 -0
- data/lib/recipe_scrapers/sites/com/gourmandize.rb +3 -0
- data/lib/recipe_scrapers/sites/com/grandfrais.rb +5 -0
- data/lib/recipe_scrapers/sites/com/handletheheat.rb +3 -0
- data/lib/recipe_scrapers/sites/com/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/com/howtofeedaloon.rb +3 -0
- data/lib/recipe_scrapers/sites/com/insanelygoodrecipes.rb +3 -0
- data/lib/recipe_scrapers/sites/com/iowagirleats.rb +3 -0
- data/lib/recipe_scrapers/sites/com/jamieoliver.rb +3 -0
- data/lib/recipe_scrapers/sites/com/joshuaweissman.rb +6 -0
- data/lib/recipe_scrapers/sites/com/joyfoodsunshine.rb +3 -0
- data/lib/recipe_scrapers/sites/com/justalittlebitofbacon.rb +3 -0
- data/lib/recipe_scrapers/sites/com/justapinch.rb +3 -0
- data/lib/recipe_scrapers/sites/com/justonecookbook.rb +3 -0
- data/lib/recipe_scrapers/sites/com/kalejunkie.rb +3 -0
- data/lib/recipe_scrapers/sites/com/kennymcgovern.rb +3 -0
- data/lib/recipe_scrapers/sites/com/kingarthurbaking.rb +3 -0
- data/lib/recipe_scrapers/sites/com/kitchendivas.rb +3 -0
- data/lib/recipe_scrapers/sites/com/lacucinaitaliana.rb +3 -0
- data/lib/recipe_scrapers/sites/com/latelierderoxane.rb +3 -0
- data/lib/recipe_scrapers/sites/com/lidiasitaly.rb +7 -0
- data/lib/recipe_scrapers/sites/com/loveandlemons.rb +3 -0
- data/lib/recipe_scrapers/sites/com/lovefood.rb +6 -0
- data/lib/recipe_scrapers/sites/com/magimix.rb +7 -0
- data/lib/recipe_scrapers/sites/com/mccormick.rb +3 -0
- data/lib/recipe_scrapers/sites/com/melloschourico.rb +7 -0
- data/lib/recipe_scrapers/sites/com/mykitchen101.rb +7 -0
- data/lib/recipe_scrapers/sites/com/mykitchen101en.rb +7 -0
- data/lib/recipe_scrapers/sites/com/netacooks.rb +3 -0
- data/lib/recipe_scrapers/sites/com/nibbledish.rb +3 -0
- data/lib/recipe_scrapers/sites/com/ohsheglows.rb +3 -0
- data/lib/recipe_scrapers/sites/com/ohsweetbasil.rb +3 -0
- data/lib/recipe_scrapers/sites/com/omnivorescookbook.rb +3 -0
- data/lib/recipe_scrapers/sites/com/paninihappy.rb +7 -0
- data/lib/recipe_scrapers/sites/com/pastificiosorrentino.rb +3 -0
- data/lib/recipe_scrapers/sites/com/pauladeen.rb +6 -0
- data/lib/recipe_scrapers/sites/com/pickuplimes.rb +3 -0
- data/lib/recipe_scrapers/sites/com/poppycooks.rb +3 -0
- data/lib/recipe_scrapers/sites/com/potatorolls.rb +3 -0
- data/lib/recipe_scrapers/sites/com/primaledgehealth.rb +3 -0
- data/lib/recipe_scrapers/sites/com/recipe.rb +6 -0
- data/lib/recipe_scrapers/sites/com/recipes.rb +5 -0
- data/lib/recipe_scrapers/sites/com/rosannapansino.rb +6 -0
- data/lib/recipe_scrapers/sites/com/scrambledandscrumptious.rb +6 -0
- data/lib/recipe_scrapers/sites/com/sharkninja.rb +3 -0
- data/lib/recipe_scrapers/sites/com/simplegreensmoothies.rb +3 -0
- data/lib/recipe_scrapers/sites/com/simplyscratch.rb +3 -0
- data/lib/recipe_scrapers/sites/com/sunbasket.rb +3 -0
- data/lib/recipe_scrapers/sites/com/sundaysuppermovement.rb +3 -0
- data/lib/recipe_scrapers/sites/com/tastefullygrace.rb +3 -0
- data/lib/recipe_scrapers/sites/com/tasteline.rb +3 -0
- data/lib/recipe_scrapers/sites/com/tastinghistory.rb +7 -0
- data/lib/recipe_scrapers/sites/com/thecookingguy.rb +6 -0
- data/lib/recipe_scrapers/sites/com/thefirstmess.rb +3 -0
- data/lib/recipe_scrapers/sites/com/theplantbasedschool.rb +3 -0
- data/lib/recipe_scrapers/sites/com/tudoreceitas.rb +3 -0
- data/lib/recipe_scrapers/sites/com/vegansociety.rb +6 -0
- data/lib/recipe_scrapers/sites/com/velocidadcuchara.rb +3 -0
- data/lib/recipe_scrapers/sites/com/veroniquecloutier.rb +6 -0
- data/lib/recipe_scrapers/sites/com/watchwhatueat.rb +3 -0
- data/lib/recipe_scrapers/sites/com/weightwatchers.rb +3 -0
- data/lib/recipe_scrapers/sites/com/whole30.rb +3 -0
- data/lib/recipe_scrapers/sites/com/xiachufang.rb +3 -0
- data/lib/recipe_scrapers/sites/cz/fresh.rb +3 -0
- data/lib/recipe_scrapers/sites/de/aldi_sued.rb +3 -0
- data/lib/recipe_scrapers/sites/de/eatsmarter.rb +3 -0
- data/lib/recipe_scrapers/sites/de/edeka.rb +3 -0
- data/lib/recipe_scrapers/sites/de/essen_und_trinken.rb +3 -0
- data/lib/recipe_scrapers/sites/de/franzoesischkochen.rb +3 -0
- data/lib/recipe_scrapers/sites/de/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/de/lecker.rb +3 -0
- data/lib/recipe_scrapers/sites/de/madamecuisine.rb +3 -0
- data/lib/recipe_scrapers/sites/de/ndr.rb +3 -0
- data/lib/recipe_scrapers/sites/de/rezeptwelt.rb +3 -0
- data/lib/recipe_scrapers/sites/de/sallys_blog.rb +3 -0
- data/lib/recipe_scrapers/sites/de/zaubertopf.rb +6 -0
- data/lib/recipe_scrapers/sites/dk/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/dk/valdemarsro.rb +3 -0
- data/lib/recipe_scrapers/sites/es/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_albacete.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_alcala.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_algeciras.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_alicante.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_almeria.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_alzira.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_badajoz.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_barcelona.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_barcelona_centro.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_bilbao.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_burgos.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_caceres.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_cadiz.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_cartagena.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_castellon.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_ciudadreal.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_cordoba.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_coruna.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_doshermanas.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_elche.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_esplugues.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_fuenlabrada.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_gijon.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_girona.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_granada.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_huelva.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_jaen.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_jerez.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_lanzarote.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_laspalmas.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_leon.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_lleida.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_madrid_centro.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_madrid_mendezalvaro.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_majadahonda.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_malaga.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_malaga_centro.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_mallorca.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_manresa.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_marbella.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_mataro.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_mostoles.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_murcia.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_orense.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_pamplona.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_plasencia.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_pontevedra.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_sabadell.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_salamanca.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_sansebastian.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_santander.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_sevilla.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_ssreyes.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_talavera.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_tarragona.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_tenerife.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_tenerifesur.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_toledo.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_valencia.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_valladolid.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_vic.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_vigo.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_vitoria.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomix_zaragoza.rb +3 -0
- data/lib/recipe_scrapers/sites/es/thermomixasturias.rb +3 -0
- data/lib/recipe_scrapers/sites/eu/ninjatestkitchen.rb +5 -0
- data/lib/recipe_scrapers/sites/fr/cuisine.rb +3 -0
- data/lib/recipe_scrapers/sites/fr/cuisinez_pour_bebe.rb +5 -0
- data/lib/recipe_scrapers/sites/fr/editions_larousse.rb +7 -0
- data/lib/recipe_scrapers/sites/fr/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/fr/marieclaire.rb +3 -0
- data/lib/recipe_scrapers/sites/fr/moulinex.rb +3 -0
- data/lib/recipe_scrapers/sites/fr/quitoque.rb +3 -0
- data/lib/recipe_scrapers/sites/gr/argiro.rb +3 -0
- data/lib/recipe_scrapers/sites/hr/recepti.rb +3 -0
- data/lib/recipe_scrapers/sites/hu/aldi.rb +3 -0
- data/lib/recipe_scrapers/sites/hu/mindmegette.rb +3 -0
- data/lib/recipe_scrapers/sites/ie/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/it/aldi.rb +7 -0
- data/lib/recipe_scrapers/sites/it/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/it/lacucinaitaliana.rb +3 -0
- data/lib/recipe_scrapers/sites/it/vegolosi.rb +3 -0
- data/lib/recipe_scrapers/sites/lu/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/nl/24kitchen.rb +3 -0
- data/lib/recipe_scrapers/sites/nl/culy.rb +3 -0
- data/lib/recipe_scrapers/sites/nl/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/nl/keukenliefde.rb +3 -0
- data/lib/recipe_scrapers/sites/nl/kookjij.rb +3 -0
- data/lib/recipe_scrapers/sites/nl/okokorecepten.rb +3 -0
- data/lib/recipe_scrapers/sites/nl/uitpaulineskeuken.rb +3 -0
- data/lib/recipe_scrapers/sites/no/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/nz/dish.rb +7 -0
- data/lib/recipe_scrapers/sites/nz/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/org/choosehomemade.rb +7 -0
- data/lib/recipe_scrapers/sites/org/usapears.rb +7 -0
- data/lib/recipe_scrapers/sites/pl/kuchnia_domowa.rb +3 -0
- data/lib/recipe_scrapers/sites/pt/mundodereceitasbimby.rb +3 -0
- data/lib/recipe_scrapers/sites/se/arla.rb +3 -0
- data/lib/recipe_scrapers/sites/se/drinkoteket.rb +3 -0
- data/lib/recipe_scrapers/sites/se/festligare.rb +6 -0
- data/lib/recipe_scrapers/sites/se/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/sk/dobruchut.rb +3 -0
- data/lib/recipe_scrapers/sites/sk/varecha.rb +3 -0
- data/lib/recipe_scrapers/sites/tv/delishkitchen.rb +3 -0
- data/lib/recipe_scrapers/sites/uk/bbc.rb +3 -0
- data/lib/recipe_scrapers/sites/uk/foodnetwork.rb +3 -0
- data/lib/recipe_scrapers/sites/uk/hellofresh.rb +3 -0
- data/lib/recipe_scrapers/sites/uk/nhs.rb +5 -0
- data/lib/recipe_scrapers/sites/uk/schoolofwok.rb +7 -0
- data/lib/recipe_scrapers/sites/uk/thehappyfoodie.rb +3 -0
- data/lib/recipe_scrapers/sites/uk/tofoo.rb +7 -0
- data/lib/recipe_scrapers/sources/declared.rb +21 -6
- data/lib/recipe_scrapers/sources/ingredient_groups.rb +4 -2
- data/lib/recipe_scrapers/sources/json_ld.rb +4 -2
- data/lib/recipe_scrapers/sources/microdata.rb +1 -1
- data/lib/recipe_scrapers/sources/schema_org/ingredient_list.rb +2 -1
- data/lib/recipe_scrapers/sources/schema_org/step_labels.rb +15 -0
- data/lib/recipe_scrapers/sources/schema_org.rb +6 -1
- data/lib/recipe_scrapers/text.rb +44 -2
- data/lib/recipe_scrapers/version.rb +1 -1
- data/lib/recipe_scrapers.rb +1 -0
- metadata +247 -2
- data/lib/recipe_scrapers/sites/com/hostthetoast.rb +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: aa41ed3d10b633dfa62092781980df9d856b24a573d015f52d5e359974614aeb
|
|
4
|
+
data.tar.gz: c085500687dc3ba6c64bcad9d0bc525349c7567a144ba0f1070646b0be2f34fb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 603b8bcf380f9926cda1629dad1a869b57b2c711984554c7ac0968b6a984413be85dfd484325ec3c9356ee3fd4016e91cdd83acbd9e61520936a03c17c2997d9
|
|
7
|
+
data.tar.gz: f7de34e7fb23d07749285d268c612f89eab8279732fabde8dcee386df196fea98c2e27548ccb777ff5daed907686281c4d6fbac3db48c67911480ce3896b3eef
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.0](https://github.com/davqasd/recipe_scrapers/compare/v0.1.0...v0.2.0) (2026-09-27)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* declare rows split into lines or with parts skipped ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
9
|
+
* read recipes from 246 more sites ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* drop blank braille padding from text ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
15
|
+
* drop step names that only number the step ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
16
|
+
* find a microdata recipe nested inside another item ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
17
|
+
* read an image address glued behind the site host ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
18
|
+
* read declared rows the way the page renders them ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
19
|
+
* read JSON-LD that repeats a key or sits in a comment ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
20
|
+
* split ingredients and steps published as one string ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
21
|
+
* stop reading hostthetoast.com, which now blocks every request ([a8a1203](https://github.com/davqasd/recipe_scrapers/commit/a8a120363c6b2ba96afa0fcaba6b605a9d9dd408))
|
|
22
|
+
|
|
3
23
|
## 0.1.0
|
|
4
24
|
|
|
5
25
|
The first release.
|
data/README.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# recipe_scrapers
|
|
2
2
|
|
|
3
|
+
[](https://github.com/davqasd/recipe_scrapers)
|
|
4
|
+
[](https://rubygems.org/gems/recipe_scrapers)
|
|
5
|
+
[](https://rubygems.org/gems/recipe_scrapers)
|
|
6
|
+
[](https://github.com/davqasd/recipe_scrapers/actions/workflows/ci.yml)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
3
9
|
A Ruby gem that reads recipes from cooking websites: the title, ingredients, instructions, times,
|
|
4
10
|
yields and nutrition. It uses the [schema.org](https://schema.org/Recipe) markup most recipe sites
|
|
5
11
|
publish, falls back to [OpenGraph](https://ogp.me/), and reads the HTML directly for sites that
|
|
@@ -7,11 +13,24 @@ publish neither. It does not get around bot protection.
|
|
|
7
13
|
|
|
8
14
|
## Installation
|
|
9
15
|
|
|
16
|
+
Add it to your Gemfile:
|
|
17
|
+
|
|
18
|
+
<!-- x-release-please-start-version -->
|
|
19
|
+
```ruby
|
|
20
|
+
gem "recipe_scrapers", "~> 0.2.0"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Or install it manually:
|
|
24
|
+
|
|
10
25
|
```console
|
|
11
|
-
|
|
26
|
+
gem install recipe_scrapers --version "~> 0.2.0"
|
|
12
27
|
```
|
|
28
|
+
<!-- x-release-please-end -->
|
|
13
29
|
|
|
14
|
-
The gem
|
|
30
|
+
The gem follows [Semantic Versioning](https://semver.org/). Until 1.0, a minor release can change
|
|
31
|
+
the public API, so the constraint above takes only patch releases.
|
|
32
|
+
[GitHub releases](https://github.com/davqasd/recipe_scrapers/releases) list the changes of each
|
|
33
|
+
version. The gem runs on every Ruby version that has not reached its end of life.
|
|
15
34
|
|
|
16
35
|
## Usage
|
|
17
36
|
|
|
@@ -34,13 +53,14 @@ recipe = RecipeScrapers.parse(html, url: url)
|
|
|
34
53
|
|
|
35
54
|
## Documentation
|
|
36
55
|
|
|
37
|
-
- [
|
|
38
|
-
- [
|
|
39
|
-
- [
|
|
40
|
-
- [
|
|
56
|
+
- [Supported Sites](https://github.com/davqasd/recipe_scrapers/wiki/Supported-Sites): every site the gem reads out of the box
|
|
57
|
+
- [Usage](https://github.com/davqasd/recipe_scrapers/wiki/Usage): fetching, other HTTP clients, unsupported sites, errors
|
|
58
|
+
- [Recipe Fields](https://github.com/davqasd/recipe_scrapers/wiki/Recipe-Fields): every field with its type and an example
|
|
59
|
+
- [Configuration](https://github.com/davqasd/recipe_scrapers/wiki/Configuration): timeouts, size limits, your own connection
|
|
60
|
+
- [Parsers](https://github.com/davqasd/recipe_scrapers/wiki/Parsers): your own ingredient and nutrient parsers
|
|
41
61
|
- [API reference](https://rubydoc.info/gems/recipe_scrapers)
|
|
42
62
|
- [Changelog](CHANGELOG.md)
|
|
43
|
-
- [Copyright and Usage](wiki/Copyright-and-Usage
|
|
63
|
+
- [Copyright and Usage](https://github.com/davqasd/recipe_scrapers/wiki/Copyright-and-Usage): what you are responsible for
|
|
44
64
|
|
|
45
65
|
## Contributing
|
|
46
66
|
|
|
@@ -51,4 +71,4 @@ security problem privately, see [SECURITY](SECURITY.md).
|
|
|
51
71
|
## License
|
|
52
72
|
|
|
53
73
|
MIT, see [LICENSE](LICENSE). The pages recorded for the tests are not covered by it, see
|
|
54
|
-
[License](wiki/License
|
|
74
|
+
[License](https://github.com/davqasd/recipe_scrapers/wiki/License).
|
|
@@ -3,3 +3,4 @@ units: [cs, cc, pincée, pincées, poignée, poignées, gousse, gousses, brin, b
|
|
|
3
3
|
tranches, tran, sachet, sachets, cuillère, cuillères, c. à soupe, c. à café, cuillère à soupe,
|
|
4
4
|
cuillères à soupe, cuillère à café, cuillères à café]
|
|
5
5
|
pinches: [pincée, poignée]
|
|
6
|
+
steps: [étape, etape]
|
|
@@ -4,12 +4,13 @@ require "yaml"
|
|
|
4
4
|
|
|
5
5
|
module RecipeScrapers
|
|
6
6
|
module Parsers
|
|
7
|
-
# The words
|
|
7
|
+
# The words the gem reads recipes with: units, pinch words, size adjectives, qualifiers and number
|
|
8
|
+
# words for {Ingredients}, and the words that label a numbered step.
|
|
8
9
|
# The gem bundles one vocabulary per language, plus a common one with the metric units.
|
|
9
10
|
#
|
|
10
11
|
# @api private
|
|
11
12
|
class Vocabulary
|
|
12
|
-
WORD_LISTS = %i[units pinches sizes qualifiers].freeze
|
|
13
|
+
WORD_LISTS = %i[units pinches sizes qualifiers steps].freeze
|
|
13
14
|
BUNDLED = File.expand_path("vocabulary/*.yml", __dir__)
|
|
14
15
|
NEVER = "(?!)"
|
|
15
16
|
private_constant :WORD_LISTS, :BUNDLED, :NEVER
|
|
@@ -26,6 +27,9 @@ module RecipeScrapers
|
|
|
26
27
|
# @return [Array<String>] words before an amount that are not part of it, such as "about"
|
|
27
28
|
attr_reader :qualifiers
|
|
28
29
|
|
|
30
|
+
# @return [Array<String>] words that label a numbered step, such as "step" in "Step 2"
|
|
31
|
+
attr_reader :steps
|
|
32
|
+
|
|
29
33
|
# @return [Hash{String => Numeric}] amounts written as words, such as "two" => 2
|
|
30
34
|
attr_reader :number_words
|
|
31
35
|
|
|
@@ -57,6 +61,13 @@ module RecipeScrapers
|
|
|
57
61
|
combine(names_for(language))
|
|
58
62
|
end
|
|
59
63
|
|
|
64
|
+
# @return [Vocabulary] every vocabulary in the catalog added together
|
|
65
|
+
#
|
|
66
|
+
# @api private
|
|
67
|
+
def all
|
|
68
|
+
combine(catalog.keys)
|
|
69
|
+
end
|
|
70
|
+
|
|
60
71
|
# @param names [Array<Symbol>]
|
|
61
72
|
# @return [Vocabulary] the named vocabularies added together
|
|
62
73
|
#
|
|
@@ -96,16 +107,14 @@ module RecipeScrapers
|
|
|
96
107
|
end
|
|
97
108
|
end
|
|
98
109
|
|
|
99
|
-
# @param units [Array<String>]
|
|
100
|
-
# @param pinches [Array<String>]
|
|
101
|
-
# @param sizes [Array<String>]
|
|
102
|
-
# @param qualifiers [Array<String>]
|
|
103
110
|
# @param number_words [Hash{String => Numeric}]
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
111
|
+
# @param lists [Hash{Symbol => Array<String>}] the word lists: units, pinches, sizes, qualifiers and steps
|
|
112
|
+
# @raise [ArgumentError] when a list is not one of those
|
|
113
|
+
def initialize(number_words: {}, **lists)
|
|
114
|
+
unknown = lists.keys - WORD_LISTS
|
|
115
|
+
raise ArgumentError, "unknown word lists: #{unknown.join(", ")}" unless unknown.empty?
|
|
116
|
+
|
|
117
|
+
WORD_LISTS.each { |list| instance_variable_set(:"@#{list}", Array(lists[list]).uniq.freeze) }
|
|
109
118
|
@number_words = number_words.freeze
|
|
110
119
|
end
|
|
111
120
|
|
|
@@ -27,6 +27,8 @@ module RecipeScrapers
|
|
|
27
27
|
|
|
28
28
|
# Every field a scraper answers, in the order {#to_h} returns them.
|
|
29
29
|
CONTRACT = (Models::Recipe.members - %i[url]).freeze
|
|
30
|
+
EMBEDDED_ADDRESS = %r{\Ahttps?://[^/?#]*?(?<address>https?://.+)\z}
|
|
31
|
+
private_constant :EMBEDDED_ADDRESS
|
|
30
32
|
|
|
31
33
|
class << self
|
|
32
34
|
# Names the host a subclass reads, or returns it.
|
|
@@ -145,7 +147,7 @@ module RecipeScrapers
|
|
|
145
147
|
# (see Models::Recipe#image)
|
|
146
148
|
def image
|
|
147
149
|
address = @declared.text(:image) || @schema.image || @open_graph.image
|
|
148
|
-
address && URI.join(url, address).to_s
|
|
150
|
+
address && URI.join(url, address[EMBEDDED_ADDRESS, :address] || address).to_s
|
|
149
151
|
rescue URI::Error
|
|
150
152
|
address
|
|
151
153
|
end
|
|
@@ -181,8 +183,10 @@ module RecipeScrapers
|
|
|
181
183
|
private
|
|
182
184
|
|
|
183
185
|
def ingredient_sections
|
|
184
|
-
@ingredient_sections ||=
|
|
185
|
-
|
|
186
|
+
@ingredient_sections ||= Sources::IngredientGroups.sections(
|
|
187
|
+
@declared.rows(:ingredients) || @schema.ingredients || [],
|
|
188
|
+
headings: @declared.headings_among_rows
|
|
189
|
+
)
|
|
186
190
|
end
|
|
187
191
|
|
|
188
192
|
def marked_groups(lines)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RecipeScrapers.register "amazingoriental.com" do
|
|
4
|
+
title "h1"
|
|
5
|
+
ingredients rows: "div.ingredients-wrap li"
|
|
6
|
+
ingredient_groups heading: "div.ingredients-wrap h5", item: "div.ingredients-wrap li"
|
|
7
|
+
instructions rows: "div.text-wrap > h2 + ul > li", skip: "span.number"
|
|
8
|
+
end
|