Unicode Problem Django-Python-urllib-MySQL
Frage
Ich bin das Abrufen einer Webseite ( http://autoweek.com ) und versucht, es zu verarbeiten, aber kodieren Fehler bekommen . Autoweek erklärt "iso-8859-1" Codierung und hat das Wort "Nürburgring" (u mit Umlaute)
ich:
# -*- encoding: utf-8 -*-
import urllib
webpage = urllib.urlopen(feed.crawl_url).read()
webpage.decode("utf-8")
es gibt mir die folgende Fehlermeldung:
'utf8' codec can't decode bytes in position 7768-7773: unsupported Unicode code range"
wenn ich .decode Schritt umgehen und eine Analyse mit lxml Bibliothek tun, wirft es einen Fehler, wenn ich analysierte Titel Datenbank speicherte:
'utf8' codec can't decode bytes in position 45-50: unsupported Unicode code range
Meine Datenbank hat Zeichensatz UTF-8 und Sortierungs utf-general-ci
Meine Einstellungen:
Django
Python 2.4.3
MySQL 5.0.22
MySQL-Python 1.2.1
mod_python 3.2.8
Lösung
autoweek.com scheint über seine eigene Codierung verwirrt. Es erklärt widersprüchlichen charset Definitionen:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
und später ...
<meta charset=iso-8859-1"/>.
iso-8859-1 ist die richtige, da dies im Header vom Webserver und durch die .info()
Methode zurückgegeben wird (und es decodiert tatsächlich), aber dies zeigt, dass man nicht unbedingt auf dem Content-Type verlassen kann Erklärung in Web-Seiten. Sie sollten das Verfahren durch lavinio beschrieben folgen.
Andere Tipps
Wenn die webpage
Codierung iso-8859-1
erklärt, können Sie nicht nur nicht webpage.decode("iso-8859-1")
?
An diesem Punkt webpage
wird für Ihre Anwendung decodiert. Wenn es in die Datenbank geschrieben wird, soll die Zuordnung dort behandelt die char-to-UTF-8-Codierung.
Um die richtige Codierung zu erhalten, entweder den Webserver sagen, dass Sie nur akzeptieren, sagen wir, UTF-8 und dann ist das, was Sie (hoffentlich) immer erhalten, da nur etwa jeder UTF-8 liest (oder man könnte es versuchen mit ISO-8859-1); oder verwenden Sie .info die Codierung Name des Stroms zu inspizieren zurückgegeben.
Siehe urllib2 - The Missing Manual und Kurzübersicht über HTTP-Header .