[Python-es] error al decodificar unicode

P@vel pdlopez en uci.cu
Lun Mar 7 13:57:06 CET 2011


Chema Cortes este es mi codigo : 

from BeautifulSoup import BeautifulSoup 
import urllib,urllib2 
from conexion import Conexion 
import codecs 

def get_html(url_page="http://www.bolsamadrid.es/esp/mercados/fondos/htm/trenta100.htm"): 
proxy_h = urllib2.ProxyHandler({"http" : "http://pdlopez@hlg.uci.cu:paveling84074@100.0.0.1:3128"}) 
opener = urllib2.build_opener(proxy_h) 
urllib2.install_opener(opener) 
f = urllib2.urlopen(url_page) 

data = f.read() 
return data 

def parser_bolsa(html_page): 
conn = Conexion() 
#page = urllib.urlopen(url_page) 
html = BeautifulSoup(html_page) 
for incident1 in html('tr',bgcolor="#ffffff"): 
#if incident1.contents[5].contents == [u'RENTA VARIABLE NACIONAL']: 
gestora = incident1.contents[1].contents[0] 
fondo = str(incident1.contents[3].contents[0]) 
ini = fondo.find(')\">')+3 
fin = fondo.find('</a>') 
fondo = fondo[ini:fin] 
ultimo = incident1.contents[9].contents[0] 
fecha = str(incident1.contents[7].contents[0]) 
fecha = fecha[6:10]+"-"+fecha[3:5]+"-"+fecha[0:2] 
patrim = str(incident1.contents[15].contents[0]) 
participes = str(incident1.contents[17].contents[0]) 
vocacion = incident1.contents[5].contents[0] 
sql = "INSERT INTO `bolsa` (`id`, `gestora`,`vocacion`,`fecha`,`ultimo`,patrim,`participes`) VALUES(NULL,'%s','%s','%s','%s','%s','%s');" %(gestora,vocacion,fecha,ultimo,patrim,participes) 
conn.cursor.execute(sql) 
#print gestora,fondo,vocacion,fecha,ultimo,patrim,participes 
#else: 
#pass 

html_page = get_html() 
parser_bolsa(html_page) 

*******************Error que me da******************************************************************* 
Traceback (most recent call last): 
File "/home/pavel/workspace/bolsa/src/aplication/parser.py", line 42, in <module> 
parser_bolsa(html_page) 
File "/home/pavel/workspace/bolsa/src/aplication/parser.py", line 36, in parser_bolsa 
conn.cursor.execute(sql) 
File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 149, in execute 
query = query.encode(charset) 
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u0144' in position 121: ordinal not in range(256) 
**************************************************************************************************** 
PD: En el adjunto esta el script de la base de datos es una sola tabla 
**************************************************************************************************** 

De: "Chema Cortes" <pych3m4 en gmail.com> 
Enviados: Lunes, 7 de Marzo 2011 5:20:29 
Asunto: Re: [Python-es] error al decodificar unicode 

Bueno, al menos vemos que hay una parte que funciona. No entiendo el 
resto del código que pones pues 'codecs.open' es para manejar ficheros 
de texto y no tiene sentido el modo como lo usas. 

Pero de lo que comentas, parece que ya tienes la cadena unicode y 
donde te surgen los problemas es en la introducción de la cadena en la 
base de datos (que no sabemos cuál es). 

De lo que dije sobre unicode y python habría que añadir un corolario 
sobre lo que pasa con las bases de datos (me centraré más en oracle ya 
que, haciendo honor a su nombre, es la más esotérica de todas): 

- Tablas: del mismo modo que los ficheros de texto, las tablas 
utilizan una codificación de caracteres que es fijada en el momento de 
su creación. Un problema frecuente proviene de considerar como tamaño 
de campo el número de bytes y no el número de caracteres. El tamaño de 
una cadena codificada en utf8 es posible que no quepa en un tamaño de 
campo pensando para una cadena ascii. En oracle se puede dar tamaños 
de campos en bytes o en chars, recomendando usar chars como medida de 
tamaño. 

- Cliente-Servidor: cuando se estable una conexión con la base de 
datos, el canal también usa una codificación de caracteres. Esta 
codificación se puede fijar como un parámetro de la conexión, con 
excepción en oracle que lo toma desde una variable de entorno. Para 
utf8 y español sería definir la siguiente variable: 

NLS_LANG=SPANISH_SPAIN.AL32UTF8 


Espero que ésto te sea de alguna ayuda. Deberías precisar mejor el 
problema, con parte de código "concreto" que usas y el texto del 
"error" que te da. 


> 
> ya probe con hacer esto dentro de mi funcion 
> def 
> get_html(url_page="http://www.bolsamadrid.es/esp/mercados/fondos/htm/trenta100.htm"): 
> proxy_h = urllib2.ProxyHandler({"http" : 
> "http://pdlopez@hlg.uci.cu:paveling84074@100.0.0.1:3128"}) 
> opener = urllib2.build_opener(proxy_h) 
> urllib2.install_opener(opener) 
> f = urllib2.urlopen(url_page) 
> 
> data = f.read() 
> data = codecs.open(data) #Esto 
> return data 
> y me saca todo el codigo de la pagina y la otra funcion a la cual le paso lo 
> que tengo en data, ahora no hace nada 
_______________________________________________ 
Python-es mailing list 
Python-es en python.org 
http://mail.python.org/mailman/listinfo/python-es 
FAQ: http://python-es-faq.wikidot.com/ 
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20110307/94ff6209/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: bolsa.sql
Type: text/x-sql
Size: 1002 bytes
Desc: no disponible
URL: <http://mail.python.org/pipermail/python-es/attachments/20110307/94ff6209/attachment.bin>


Más información sobre la lista de distribución Python-es