Python Parser für Rezepte:
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):
# -*- 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