Python Parser für Rezepte:[Bearbeiten | Quelltext bearbeiten]
Mit diesem Parser (in Python) können die Zutaten einer gespeicherten Seite (im Quelltext) ausgelesen werden. Ich muss es noch mit vielen Rezepten testen, also noch mit Vorsicht benutzen.
Entstanden ist dieses Programm, weil ich Einkaufslisten aus verschiedenen Rezepten erstellen wollte. Das Herauskopieren und Umrechnen wurde mir einfach zu mühsam :-)
Code (vom 23.02.16@05:49):[Bearbeiten | Quelltext bearbeiten]
# -*- coding: utf-8 -*- import argparse import re import sys import urlfetch, urllib def fetch_recipie(titel): urlpage = "http://kochwiki.org/w/api.php?action=query&titles=" + urllib.quote_plus(titel) + "&prop=revisions&rvprop=content&format=json&formatversion=2" response = urlfetch.fetch(urlpage).content response = response.replace("\\n", "\n") return response def einheit_finden(split_line): einheit = "" valid_mass = ["cm<sup>3</sup>", "cm", "l", "dl", "cl", "ml", "Liter", "Ta", "Tasse", "Tassen", "g" ,"Gramm", "dg", "cg", "mg", "Milligramm", "dag", "kg", "Kilogramm", "Pfund", "lb", "Bd", "Bund", "Tr", "Tropfen", "Spr", "Spritzer", "TL", "Teelöffel", "BL", "Barlöffel", "EL", "Esslöffel", "Msp", "Pr", "Prise", "Do", "Dose", "Kt", "Karton", "Stk", "Stück", "Pk", "Pck", "Päckchen", "Packung", "Sch", "Scheibe", "Bl", "Blatt", "kl", "klein", "mt", "Mittelgross", "{{B|1|8}}", "{{B|1|4}}", "{{B|1|2}}", "Scheibe", "Scheiben"] for word in split_line: if word in valid_mass: einheit = word break return einheit def zutat_finden(line): zutat = "Keine Zutat gefunden!" match = re.search(' \[\[.*?:(.*?)\|(.*?)\]\]', line) matchalt = re.search(' \[\[(.*?)\]\]', line) if match: zutat = match.group(1) else: if matchalt: zutat = matchalt.group(1) return zutat def menge_finden(line): menge = "" match = re.findall('(\d*\,\d+|\d+|\{\{B\|1\|2\}\}|\{\{B\|1\|4\}\}|\{\{B\|1\|8\}\})', line) if len(match) > 1: menge = match[1] if len(match) == 1: menge = match[0] return menge def zielmenge_neu(menge, zielmenge): menge = menge.replace(',','.') if menge == "{{B|1|2}}": menge = "0.5" if menge == "{{B|1|4}}": menge = "0.25" if menge == "{{B|1|8}}": menge = "0.125" if menge == "": menge = 0 menge_neu = float(menge) / float(origmenge) * zielmenge return menge_neu parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('-a', '--anzahl', action='store_true', help='Rezept ist geschrieben für wie viele Personen?') parser.add_argument('-z', '--zutaten', action='store_true', help='Berechne Zutaten für -u Personen.') parser.add_argument('-u', '--umrechnen', help='Rezeptmenge soll für diese Anzahl Personen umgerechnet werden.') parser.add_argument('-d', '--datei', help='Name der Datei mit dem Rezept') parser.add_argument('-t', '--titel', help='Titel des Rezepts im Kochwiki') args = parser.parse_args() if args.datei: datei = open(args.datei, 'r') inhalt = datei.readlines() if args.titel: inhalt = fetch_recipie(args.titel) inhalt = inhalt.split('\n') zielmenge = float(args.umrechnen) origmenge = -1 for line in inhalt: if 'Menge' in line: match = re.search('(\d+)', line) origmenge = match.group(1) matchalt = re.search('Hauptspeise:\s([1-9].*?)\s', line) if matchalt: origmenge = matchalt.group(1) if origmenge == -1: print "Menge konnte aus Rezept nicht ermittelt werden" print "Menge wird auf 1 gesetzt" origmenge = 1 inblock = False zutaten = list() zutat = list() for line in inhalt: match = re.search('^==\s(.*?)\s==', line) if match: matchstring = match.group(1).strip() if matchstring == 'Zutaten' and inblock == False: inblock = True if matchstring <> 'Zutaten' and inblock == True: inblock = False if inblock: if '*' in line: split_line = line.split() einheit = einheit_finden(split_line) zut = zutat_finden(line) menge = menge_finden(line) zutat.append(zielmenge_neu(menge, zielmenge)) zutat.append(einheit) zutat.append(zut) zutaten.append(zutat) zutat = list() #Ausgeben zeile = "Menge|Einheit|Zutat" print zeile for zutat in zutaten: zeile = str(zutat[0]) + "|" + str(zutat[1]) + "|" + str(zutat[2]) print zeile