Mi experiencia es en Perl, pero estoy probando Python y BeautifulSoup para un nuevo proyecto.Python, .format() y UTF-8
En este ejemplo, estoy tratando de extraer y presentar los objetivos del enlace y el texto del enlace contenido en una sola página. Aquí está la fuente:
table_row = u'<tr><td>{}</td><td>{}</td></tr>'.encode('utf-8')
link_text = unicode(link.get_text()).encode('utf-8')
link_target = link['href'].encode('utf-8')
line_out = unicode(table_row.format(link_text, link_target))
Todas esas llamadas explícitas a .encode ('UTF-8') son mi intento de hacer este trabajo, pero no parece ayudar - lo más probable es que estoy completamente malentendido acerca de cómo Python 2.7 maneja cadenas Unicode.
De todos modos. Esto funciona bien hasta que encuentra U + 2013 en una URL (sí, realmente). En ese momento, las bombas fuera con:
Traceback (most recent call last):
File "./test2.py", line 30, in <module>
line_out = unicode(table_row.encode('utf-8').format(link_text, link_target.encode('utf-8')))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 79: ordinal not in range(128)
Presumiblemente .formato(), incluso aplicada a una cadena Unicode, está jugando tontos sodomiza y tratando de hacer una operación .decode(). Y como ASCII es el valor predeterminado, lo está usando y, por supuesto, no puede asignar U + 2013 a un carácter ASCII, y por lo tanto ...
Las opciones parecen ser eliminarlo o convertirlo en otra cosa , pero realmente lo que quiero es simplemente preservarlo. En última instancia (este es solo un pequeño caso de prueba) necesito poder presentar enlaces en los que se pueda hacer clic.
La documentación de BS3 sugiere cambiar la codificación predeterminada de ASCII a UTF-8, pero leer comentarios sobre preguntas similares parece ser una muy mala idea, ya que va a ensuciar los diccionarios.
En lugar de usar Python 3.2 en su lugar (lo que significa que no hay Django, lo que estamos considerando para parte de este proyecto) ¿hay alguna manera de hacer que esto funcione limpiamente?
como una regla básica, decodificar (a Unicode) en la entrada y codificación (codificación deseada a) en la salida. – monkut