Seite 1 von 1

Umlaute und \n problem

Verfasst: Samstag 26. Juli 2008, 23:38
von Martu
Hallo,
und wieder hab ich ein Problem :oops:
Ich habe eine html-Datei mit einem Formular das die Daten von 2 Eingabefeldern per "POST" in UTF-8 an mein cgi-script schickt. Das script soll diese Daten verarbeiten und dann wieder in einer anderen html-datei ausgeben, die auch in UTF-8 sein soll. Das Funktioniert auch. Trotzdem werden in der html-datei Umlaute wie z.b. aus einem "ü" noch ein "\xc3\xbc" usw. eben.
Hier mal das script:

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*- 
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()
print "Content-Type: text/html"
print
form = cgi.FieldStorage()
autorname = form.getvalue("name", "")
autortext = form.getvalue("text", "")
#if autorname or autortext == None:
#    print """alert("Bitte füllen sie alle Felder aus")"""
#else:
#    pass
html_dat = open("c:/html_seite/vers_2/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
#html_utf = html_str.decode("utf8")
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """
<x> </x>
<tr bgcolor="#484848">
<td widht="50%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
""", autorname,"""
</td>
<td width="50%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
""", Datum_str,"""
</td>
</tr>
<tr>
<td colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
""", autortext,"""
</td>
</tr>
<tr height="25px">
</tr>"""
comment_string = str(comment)
soup.x.replaceWith(comment_string)
soup_string = str(soup)
soup_utf = soup_string.decode("utf8")
html_str.strip()
html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
html_save.write(soup_utf.encode("utf-8"))
html_save.flush()
html_save.close
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""
Ausserdem sind in der fertigen html-datei noch viele ""('\n('\n('\n \n"" zu finden. Ich weiß zwar das es zum Großteil "Linefeed" zeichen sind doch ich weiß nicht wieso da soviele sind und weshalb die angezeigt werden.


PS:Hoffe ihr verübelt mir nicht die vielen "extrem"-Anfänger-Fragen, aber ich bin nunmal einer :wink:

Verfasst: Samstag 26. Juli 2008, 23:56
von Leonidas
Weil du versuchst Tupeln zu Strings zu konvertieren, dabei zeigen eben Tupeln enthaltene Strings mit Spezialzeichen an:

Code: Alles auswählen

>>> ('äöä', 'üöäß')
('\xc3\xa4\xc3\xb6\xc3\xa4', '\xc3\xbc\xc3\xb6\xc3\xa4\xc3\x9f')
Tipp: nutze stattdessen eine Template-Engine. Das ist so oder so ein guter Tipp und sowohl Mako als auch Jinja sind ziemlich einfach zu benutzen.

Verfasst: Sonntag 27. Juli 2008, 21:51
von Martu
hmm, eigentlich habe ich nur vor die Daten die ich von einem html-formular bekomme in eine andere html-datei an einer bestimmten Stelle zu schreiben. Hatte gehofft sowas würde noch ohne eine template-engine gehen :o .
Habe mir aber trotzdem mal jinja runtergeladen und notdürftig installiert [ easy_install hat imme ne fehlermeldung gebracht :? ] aber ich kann es importieren usw. :)
Doch egal wie ich versuche das template zu laden, wenn ich es in der Idle zum testen laufen lass gehts ohne Fehler durch, doch wenn ich es dann mit dann von der webseite aufrufen lasse kommt immer ein "" 'ascii' codec can't decode byte 0xc3 in position 258: ordinal not in range(128) "" und das auch wenn ich das Formular komplett leer abgeschickt habe :? Was macht Idle da anders als der server?

Verfasst: Mittwoch 30. Juli 2008, 00:43
von Martu
Habs endlich hingekriegt das es so funktioniert wie ichs mir vorstelle :D (allerdings ohne jinja)
Das Ergebnis ist zwar bei weitem nicht perfekt (Umlaute, Sonderzeichen, und noch ein paar andere Zeichen...) aber denke mal das ich zumindest die meist benutzen zeichen wie die Umlaute noch hinkriegen werde.
Und da dies mein erstes cgi-Programm bzw. mein überhaupt erstes Programm ist wollte ich den vorerst fertigen code mal zum öffentlichen zerreißen freigeben :wink:

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*-
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/html"
print
form = cgi.FieldStorage()
autorname = form.getvalue("name", "")
autortext = form.getvalue("text", "")

#if autorname or autortext is None:
#    print """alert("Bitte füllen sie alle Felder aus")"""
#    print """<meta http-equiv="refresh" content"0; URL=../beitrag_verfassen.html">"""
#else:
#    pass
html_dat = open("c:/html_seite/vers_2/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """
<x> </x>
<tr bgcolor="#484848">
<td widht="50%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
""", autorname,"""
</td>
<td width="50%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
""", Datum_str,"""
</td>
</tr>
<tr>
<td colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
""", autortext,"""
</td>
</tr>
<tr height="25px">
</tr>"""
comment_str = str(comment)
soup.x.replaceWith(comment_str)
soup_str = str(soup)
soup_tup = soup_str.partition("content_anfang")
(kopf, trenner, content) = soup_tup
content_rep = content.replace("(", "").replace(")", "").replace("'", "").replace(",", "")
content_esc = content_rep.decode("unicode-escape")
#soup_rep = soup_str.replace("(", "").replace(")", "").replace("'", "").replace(",", "")
#soup_esc = soup_rep.decode("unicode-escape")
html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
html_save.write(kopf)
html_save.write(trenner)
html_save.write(content_esc.encode("UTF-8"))
html_save.flush()
html_save.close
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""

Verfasst: Mittwoch 30. Juli 2008, 15:40
von BlackJack
Du solltest Dir vielleicht nochmal den Unterschied zwischen einer Datenstruktur wie einem Tupel, das ist `comment` nämlich, und deren Darstellung als Zeichenkette und einer Zeichenkette klar machen. Bau Dir eine Zeichenkette mit dem gewünschten Inhalt und nimm nicht die Zeichenkettendarstellung eines Tupels um daraus dann das "Unerwünschte" zu entfernen.

Verfasst: Mittwoch 30. Juli 2008, 21:58
von Martu
ok ich habe mal versucht das tupel zu vermeiden.
doch dabei gleich kam gleich der nächste fehler :? der für mich zumindest nicht nachvollziehbar ist.
Wenn ich versuche das Programm um es zu testen in der Idle ausführe dann kriege ich ständig nen ""Invaild Syntax" error und es wird in dem code

Code: Alles auswählen

# html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
Das "gaest" rot angestrichen, das in nem Kommentar liegt. Dachte in einem Kommentar kann man sogut wie alles schreiben (und der Dateiname ist auch richtig geschrieben)
Und wenn ich das über "cmd" ausführe wird mir bei dem ""comment"" ganz zum schluss wo ""autorname, Datum_str, autortext"" steht vom autorname das ""e"" angezeigt.

und wo ich grade dabei bin :)
Ist mein Ansatz so richtig oder habe ich da was Falsch verstanden?

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*-
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/html"
print
form = cgi.FieldStorage()
autorname = form.getvalue("name", "")
autortext = form.getvalue("text", "")
html_dat = open("c:/html_seite/vers_2/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """<x> </x>
<tr bgcolor="#484848">
<td widht="50%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
<td width="50%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr>
<td colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr height="25px">
</tr>""" autorname, Datum_str, autortext
print comment
comment
print type(comment)
#comment_str = str(comment)
soup.x.replaceWith(comment)
soup_str = str(soup)
soup_tup = soup_str.partition("content_anfang")
(kopf, trenner, content) = soup_tup
content_rep = content.replace("(", "").replace(")", "").replace("'", "").replace(",", "")
content_esc = content_rep.decode("unicode-escape")
# soup_rep = soup_str.replace("(", "").replace(")", "").replace("'", "").replace(",", "")
# soup_esc = soup_rep.decode("unicode-escape")
# html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
# html_save.write(kopf)
# html_save.write(trenner)
# html_save.write(content_esc.encode("UTF-8"))
# html_save.flush()
# html_save.close
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""

Verfasst: Mittwoch 30. Juli 2008, 22:17
von Leonidas
Du hast immer noch ein Tupel, genauso wie vorher.

Verfasst: Freitag 1. August 2008, 19:53
von Martu
So nächster anlauf :wink:
erstmal der code ( hoffe jetzt ist nirgends mehr ein tupel drin ) und dann meine probleme damit :(

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*-
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/html"
print
form = cgi.FieldStorage()
#autorname = form.getvalue("name", "")
#autortext = form.getvalue("text", "")
autorname = "testname"
autortext = "testtext"
autortext.replace("\r\n", "<br>").replace("\n", "<br>").replace("\r", "<br>")
html_dat = open("c:/html_seite/vers_3/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """<x> </x>

<tr bgcolor="#484848">
<td widht="50%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
<td width="50%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr>
<td colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr height="25px">
</tr>

""" %autorname, Datum_str, autortext
print comment
comment
print type(comment)
soup.x.replaceWith(comment)
soup_str = str(soup)
html_save = open("c:/html_seite/vers_3/gaestebuch.html", "w")
html_save.write(soup_str)
html_save.flush
html_save.close
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""
wenn ich versuche den code auszuführen gibt er mir diese Fehlermeldung :

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\html_seite\vers_3\cgi-bin\gaestebuch_vers3.py", line 40, in <module>
    """ %autorname, Datum_str, autortext
ValueError: unsupported format character '"' (0x22) at index 47
und ich weiß nicht wieso meine string formatierung da nicht funtioniert... an den 3 " " " hängts glaub ich nicht da ein test mit einem kleiner bsp string und 3 von den " " " problemlos funktioniert...

Das zweite Problem das ich momentan mit dem code habe ist das am anfang das "" autortext.replace("\r\n", ... "" nichts bringt. (auch nicht wenn ich die zeichen selbst in den string schreibe )

Verfasst: Freitag 1. August 2008, 19:59
von Leonidas
Das Problem ist, dass du nach dem % die Argumente in Klammern setzen musst.

Verfasst: Freitag 1. August 2008, 20:17
von Martu
Hab ich versucht aber auch dann gibt er mir genau die gleiche fehlermeldung.

Verfasst: Freitag 1. August 2008, 20:33
von EyDu
Ja, weil noch Prozentzeichen im im Zielstringenthalten sind, die nicht zur Formatierung dienen. Verdopple diese einfach vorher mit "...".replace("%", "%%"), dann sollte es gehen.

Verfasst: Freitag 1. August 2008, 21:11
von Martu
Danke EyDu jetzt gehts :D immer diese kleinigkeiten die man zu leicht übersieht :roll:

Verfasst: Sonntag 3. August 2008, 20:48
von Martu
So denke bald hab ichs :wink:
alles funktioniert soweit, sogar umlaute und Sonderzeichen(zumindest auch meinen PC mit firefox und IE woanders konnt ich nmoch nicht testen)

aktueller code :)

Code: Alles auswählen

#! c:\Python25\Python.exe
# -*- coding: UTF-8 -*-
import datetime
from BeautifulSoup import BeautifulSoup, Tag
import cgi
import cgitb; cgitb.enable()

print "Content-Type: text/html"
print

form = cgi.FieldStorage()
autorname = form.getvalue("name", "")
autortext = form.getvalue("text", "")
autorname_uni = autorname.decode("utf-8")
autortext_uni = autortext.decode("utf8")
autortext_uni = autortext_uni.replace("\r\n", "<br>").replace("\n", "<br>").replace("\r", "<br>")
html_dat = open("c:/html_seite/vers_2/gaestebuch.html", "r")
html_str = html_dat.read()
html_dat.close
Datum = datetime.datetime.today()
Datum_str= Datum.strftime("%d.%m.%Y um %H:%M:%S Uhr")
soup = BeautifulSoup(html_str)
comment = """<x> </x>

<tr bgcolor="#484848">
<td align="left" widht="50%%" style="border-left-width:2px; border-top-width:2px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
<td width="50%%" align="right" style="border-right-width:2px; border-top-width:2px; border-bottom-width:0px; border-left-width:0px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr>
<td align="left" colspan="2" bgcolor="#626262" style="border-width:2px; border-style:solid; border-color:#000000; ">
%s
</td>
</tr>
<tr height="25px">
</tr>

""" % (autorname_uni, Datum_str, autortext_uni)
soup.x.replaceWith(comment)
soup_str = str(soup)
html_save = open("c:/html_seite/vers_2/gaestebuch.html", "w")
html_save.write(soup_str)
html_save.flush
html_save.close
print """<a href="../gaestebuch.html">zurück zum Gästebuch</a>"""
print """<meta http-equiv="refresh" content="0; URL=../gaestebuch.html">"""
Jetzt wollte ich versuchen mit dem code:

Code: Alles auswählen

if autorname_uni or autortext_uni is None:
    print """<meta http-equiv="refresh" content="0; URL=../beitrag_verfassen.html">"""
    raise SystemExit()
herauszufinden ob nicht in die Textfelder eingegeben wurde, und wenn ja dann sollte der Browser wieder auf die beitrag verfassen seite wechseln und das script sollte sich beenden. Doch stattdessen gabs dann eine zerhauene darstellung des gästebuchs und das script konnte vom Browser aus nicht mehr richtig aufgerufen werden (immer wieder automatisch auf die beitrag verfassen seite gesetzt worden)

Und kann mir einer sagen wieso der Firefox das script richtig ausführt und der IE einfach nur den quellcode anzeigt ohne es auszuführen?

Das sollten nun aber dann auch meine letzten probleme sein :roll: