Benutzer:Cromium/Parser

aus dem Koch-Wiki (kochwiki.org)
Wechseln zu:Navigation, Suche

Python Parser für Rezepte:[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]

# -*- 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", "clZentiliter (10 ml)", "ml", "Liter", "Ta", "Tasse", "Tassen", "g" ,"Gramm",  "dg", "cg", "mg", "Milligramm", "dag", "kg", "Kilogramm", "Pfund", "lb", "BdBund", "Bund", "Tr", "Tropfen",  "Spr", "Spritzer", "TLTeelöffel (5 ml)", "Teelöffel", "BL", "Barlöffel", "ELEsslöffel (15 ml)", "Esslöffel", "Msp", "PrPrise (Menge, die sich zwischen zwei Fingern fassen lässt.)", "Prise", "Do", "Dose", "Kt",  "Karton", "Stk", "Stück", "Pk", "PckPäckchen", "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