2009-04-30 3 views
3

Ich habe ein seltsames Problem mit Lxml, wenn ich die implementierte Version meiner Django-Anwendung verwende. Ich benutze lxml, um eine andere HTML-Seite zu analysieren, die ich von meinem Server hole. Dies funktioniert einwandfrei auf meinem Entwicklungsserver auf meinem eigenen Computer, aber aus irgendeinem Grund gibt es mir UnicodeDecodeError auf dem Server.Dekodierungsprobleme in Django und Lxml

('utf8', "\x85why hello there!", 0, 1, 'unexpected code byte') 

Ich habe dafür gesorgt, dass Apache (mit mod_python) mit LANG='en_US.UTF-8' läuft.

Ich habe versucht, für dieses Problem googeln und versuchte verschiedene Ansätze zur Entschlüsselung der Zeichenfolge richtig, aber ich kann es nicht herausfinden.

In Ihrer Antwort können Sie annehmen, dass meine Zeichenfolge hello oder so genannt wird.

Antwort

3

ist keine UTF-8-codierte Zeichenfolge. Sie sollten versuchen, die Webseite zu entschlüsseln, bevor Sie sie an lxml übergeben. Überprüfen Sie, welche Codierung verwendet wird, indem Sie beim Abrufen der Seite auf die http-Header schauen. Möglicherweise finden Sie das Problem dort.

+0

Einverstanden. Probiere "\ x85why hallo da!". Decode ("utf-8"). Dadurch wird der Nicht-Unicode-Code (\ x85) in einen Unicode-Code umgewandelt. Sie müssen möglicherweise auch hinzufügen: "# - * - Codierung: UTF-8 - * -" (ohne Anführungszeichen) an den Anfang Ihrer .py-Datei. – landyman

+0

Ich stimme zu, dass dies wahrscheinlich dadurch verursacht wird, dass Sie eine Byte-Zeichenfolge zurückgeben, die tatsächlich nicht utf-8 ist. Im Allgemeinen sollten Sie, wenn Sie behaupten, eine UTF-8-Zeichenfolge zu erstellen, intern den Unicode-Typ verwenden und kurz vor dem Einfügen von Bits in die Leitung utf-8 codieren. Wenn Sie Byte-Strings zusammenfassen, werden Sie wahrscheinlich irgendwo etwas vermasseln und es dann viel später irgendwo entdecken. FWIW, "\ x85" == "#". –

-2

Da site.py Modifikation ist keine ideale Lösung versuchen, diese zu Beginn des Programms: „\ x85why hallo dort“

import sys 
reload(sys) 
sys.setdefaultencoding("utf-8") 
+0

Interessant! Sie wissen nicht, was der Anfang meines Programms in Django ist? –

+0

Der Aufruf dieses Codes vor dem Aufruf von lxml-Code sollte das Problem beheben. – ismail

+0

Leider tut es nicht ... –