urllib2 und encodings [der 1000ste Post...]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DocFisher
User
Beiträge: 50
Registriert: Donnerstag 29. November 2007, 21:04
Wohnort: Berlin
Kontaktdaten:

Sonntag 16. März 2008, 12:26

Hallo Forumsteam!

Nachdem ich gestern Abend schon mehrere Stunden mit der Suche nach einer Lösung verbracht habe, dabei auch viele Threads durchgearbeitet habe, und heute immer noch nicht auf einen grünen Zweig komme, wende ich mich mal wieder an Euch.

Ich habe ein kleines Tool geschrieben, welches mir auf www.dict.cc Suchworte übersetzt. Bei der Ausgabe werden die Umlaute aber immer in der Form \xfc für ü usw. ausgegeben.
Im Header der Website ist das charset mit iso-8859-1 angegeben.

Am vielversprechensten fand ich ja den Ansatz, alles erstmal nach unicode umzuwandeln und dann in mein Systemencoding zu codieren. Aber entweder gibts Fehlermeldungen oder es ändert sich nichts.

Beim debuggen habe ich gesehen, dass die Umlaute in den Übersetzungen nochmals escaped sind, bei "fürwahr" -> 'f\\xfcrwahr' -> als string ausgegeben: f\xfcwahr......

Damit ihr mir von dem Schlauch helfen könnt, kommt hier der Code:

Code: Alles auswählen

#!/usr/bin/env python
##-*- coding: cp1252 -*-


import wx, urllib2, re, locale

#systemencoding =  locale.getdefaultlocale()[1] 

trunk = '''http://www.dict.cc/?s='''
listReg = re.compile(r'(?:var c2Arr = new Array\()(.*)(?:\);)')
itemsReg = re.compile(r'(?:")(.*?)(?:")')


class MyFrame2(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.MAXIMIZE_BOX|wx.SYSTEM_MENU|wx.RESIZE_BORDER|wx.FRAME_TOOL_WINDOW|wx.CLIP_CHILDREN
        wx.Frame.__init__(self, *args, **kwds)
        self.static_sizer_staticbox = wx.StaticBox(self, -1, "translations from: www.dict.cc")
        self.text_ctrl_eingabe = wx.TextCtrl(self, -1, u"zu übersetzendes Wort eingeben", style=wx.TE_PROCESS_ENTER)
        self.text_ctrl_ausgabe = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_LINEWRAP|wx.TE_WORDWRAP)

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_TEXT_ENTER, self.OnEnter, self.text_ctrl_eingabe)

    def __set_properties(self):
        self.SetTitle("dict.cc GUI")
        self.SetSize((250, 600))
        self.text_ctrl_eingabe.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.text_ctrl_ausgabe.SetBackgroundColour(wx.Colour(232, 232, 232))
        #self.text_ctrl_ausgabe.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Microsoft Sans Serif"))

    def __do_layout(self):
        static_sizer = wx.StaticBoxSizer(self.static_sizer_staticbox, wx.VERTICAL)
        h_box_sizer = wx.BoxSizer(wx.VERTICAL)
        h_box_sizer.Add(self.text_ctrl_eingabe, 0, wx.EXPAND, 0)
        h_box_sizer.Add(self.text_ctrl_ausgabe, 1, wx.TOP|wx.EXPAND, 10)
        static_sizer.Add(h_box_sizer, 1, wx.EXPAND, 0)
        self.SetSizer(static_sizer)
        self.Layout()
        self.Centre()
    
    def searchDict(self, searchstring):
        url = trunk + searchstring
        source = urllib2.urlopen(url).read()
        #source = unicode(source, 'iso-8859-1')
        answer = listReg.findall(source)

        items = itemsReg.findall(str(answer))
        
        
#        for i in items:
#            re.sub(r'\\\\', r'\\', str(i))
        return items

    def OnEnter(self, event):
        self.text_ctrl_ausgabe.Clear()
        searchstring = self.text_ctrl_eingabe.GetValue()
        self.text_ctrl_ausgabe.WriteText(u'\nÜbersetzungen für "%s":\n' % searchstring)
        items = self.searchDict(searchstring)
        if len(items) > 28:
            del items[29:]
        for i in items:
            if i != "":
                print i
                self.text_ctrl_ausgabe.WriteText('\n   -  %s' %i)
            
        self.text_ctrl_eingabe.Clear()
        event.Skip()




if __name__ == "__main__":
    translator = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_3 = MyFrame2(None, -1, "")
    translator.SetTopWindow(frame_3)
    frame_3.Show()
    translator.MainLoop()
Wie ihr sehen könnt, habe ich schon ein wenig probiert, mit den encodings zu arbeiten. Dabei habe ich schon einige Varianten durch. Als letztes habe ich sogar versucht, den doppelten Backslash zu entfernen, aber auch das hat nicht geklpappt und ist auch mehr als unbefriedigend.

Hat jemand einen Tipp, wo der Hund begraben liegt?

Einen schönen Sonntag wünscht DocFisher
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Sonntag 16. März 2008, 13:02

dict.cc bietet die eigene Datenbank als Download an.

Meine Suche dafür:
grep SUCHBEGRIFF dist.cc.db

(Vorher hab ich die db mit iconv nach utf8 gewandelt ;) )
DocFisher
User
Beiträge: 50
Registriert: Donnerstag 29. November 2007, 21:04
Wohnort: Berlin
Kontaktdaten:

Sonntag 16. März 2008, 13:15

feine sache, ich werde es ausprobieren! Danke
BlackJack

Sonntag 16. März 2008, 14:21

Vielleicht solltest Du in Zeile 50 nicht einfach eine Datenstruktur (Liste) in eine Zeichenkette umwandeln um dann darin Text zu suchen. :roll:
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 16. März 2008, 17:35

Ich nutzte immer http://dict.leo.org dort, wie auch bei dict.cc mit GET eine Anfrage stellen. Mit einer passendem Firefox Bookmark Eintrag, kann ich direkt in der URL Zeile "leo Suchbegriff" schreiben und erhalte das Suchergebnis...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
DocFisher
User
Beiträge: 50
Registriert: Donnerstag 29. November 2007, 21:04
Wohnort: Berlin
Kontaktdaten:

Sonntag 16. März 2008, 19:51

@audax:
Also. ich habe mittlerweile das Programm so geändert, dass es auf die lokal gespeicherte Wortliste von dict.cc zugreifen kann. So wie ich es jetzt habe, ergibt sich auch das Problem mit den Umlauten nicht mehr.

@jens:
Das Browserfenster wollte ich mir eben ersparen und ein kleines Fensterchen am Rande des Bildschirms haben...

@BlackJack:
Kleiner aber entscheidender Einwurf von Deiner Seite. Das war der wunde Punkt. In Zukunft bin ich "ordentlicher". Danke.!

Einen schönen Abend und vielen Dank, Doc
Antworten