remaudcorentin-dev / python-marmiton

Python API to search & get recipes from the 'marmiton.com' website (web crawler, unofficial)
MIT License
42 stars 18 forks source link

Parsing does not work #19

Closed a2br closed 1 year ago

a2br commented 3 years ago

Après avoir débuggé le code d'exemple du README qui ne marchait pas (ressortait une liste vide), j'ai trouvé que c'était cette ligne qui clochait : elle ne fait pas ce qu'elle laisse penser qu'elle fait. La classe .recipe-card n'existe pas du tout dans toute la page, on dirait que ce doit être mis à jour. https://github.com/remaudcorentin-dev/python-marmiton/blob/c9f0088aaad8d603998e9c96383c328a9c9baa7e/marmiton/__init__.py#L41

grennault commented 3 years ago

Bonjour,

Tout d'abord la fonction findAll() n'existe plus et a été remplacée par find_all(). Voir Beautiful Soup Documentation (https://www.crummy.com/software/BeautifulSoup/bs4/doc/#). Ensuite, la classe recipe-card n'existe plus sur la page Marmiton (https://www.marmiton.org/recettes/recherche.aspx?).

Solution possible : Dans le script __init__.py de la library marmiton, importer le package json puis réécrire la fonction search() de la classe Marmiton.

def search(query_dict):
  base_url = "https://www.marmiton.org/recettes/recherche.aspx?"
  query_url = urllib.parse.urlencode(query_dict)
  url = base_url + query_url
  html_content = urllib.request.urlopen(url).read()
  soup = BeautifulSoup(html_content, 'html.parser')     
  return json.loads(soup.find('script', type='application/json').string)

Pour afficher l'ensemble des resultats (titres) d'une requête il suffit d'écrire dans le script example.py :

query_options = {
  "aqt": "boeuf bourguignon",  # Query keywords - separated by a white space
  "dt": "platprincipal",       # Plate type : "entree", "platprincipal", "accompagnement", "amusegueule", "sauce" (optional)
  "exp": 2,                    # Plate price : 1 -> Cheap, 2 -> Medium, 3 -> Kind of expensive (optional)
  "dif": 2,                    # Recipe difficulty : 1 -> Very easy, 2 -> Easy, 3 -> Medium, 4 -> Advanced (optional)
  "veg": 0,                    # Vegetarien only : 0 -> False, 1 -> True (optional)
}
query_result = Marmiton.search(query_options)
recipes = query_result['props']['pageProps']['searchResults']['hits']
for recipe in recipes:
    print(recipe['title'])

Merci @PaulPaillet (Voir Fix parsing issue #20).

remaudcorentin-dev commented 1 year ago

Fixed in last version (0.4.2)