[Python-es] Convertir utf8 a html entities

359 views
Skip to first unread message

Raimon Esteve

unread,
Jun 5, 2012, 7:53:52 AM6/5/12
to La lista de python en castellano
Hola,

he leido de todo y nada me ha gustado. Como convertís un string utf8 a
un string con carácteres html? o sea, que los accentos se transformen
a codificación html?

En este pequeño código, convertimos á é í ó ú ñ -> a htm entities.
Pero falta mayúsculas, ç (catalán), ....

import re

value u'Camión'

value = re.sub(r'\xe1', "á", value)
value = re.sub(r'\xe9', "é", value)
value = re.sub(r'\xed', "í", value)
value = re.sub(r'\xf3', "ó", value)
value = re.sub(r'\xfa', "ú", value)
value = re.sub(r'\xf1', "ñ", value)

--
Si us plau, NO adjunti arxius a les seves respostes. Li preguem que
integri el text al cos del missatge. Pot respondre usant NetEtiquete
que li ajudarà a seguir la conversa.
http://es.wikipedia.org/wiki/Netiquette

Por favor, NO adjunte archivos a sus respuestas. Le rogamos que
integre el texto en el cuerpo del mensaje. Puede responder usando
NetEtiquete que le ayudará a seguir la
conversación.http://es.wikipedia.org/wiki/Netiquette

Please, DO NOT send attachment files with your answers, just copy and
paste only the text you need to send into the body of your mails.
Repply using NetEtiquete. http://en.wikipedia.org/wiki/Netiquette
_______________________________________________
Python-es mailing list
Pyth...@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Raúl Cumplido

unread,
Jun 5, 2012, 8:00:59 AM6/5/12
to La lista de python en castellano
Según la documentación oficial:

http://docs.python.org/library/htmllib.html#module-htmlentitydefs

2012/6/5 Raimon Esteve <raimon...@gmail.com>



--
Raúl Cumplido

Raimon Esteve

unread,
Jun 5, 2012, 8:13:31 AM6/5/12
to La lista de python en castellano
El día 5 de junio de 2012 14:00, Raúl Cumplido
<raulcu...@gmail.com> escribió:
correcto, pero tienes que ir carácter por carácter del string. No hay
nada más "limpio"?

Raúl Cumplido

unread,
Jun 5, 2012, 8:26:56 AM6/5/12
to La lista de python en castellano
Realmente lo que viene siendo es un diccionario con todas las entities a substituir:

htmlentitydefs.codepoint2name
{8704: 'forall', 8194: 'ensp', 8195: 'emsp', 8709: 'empty', 8711: 'nabla', 8712: 'isin', 8201: 'thinsp', 8715: 'ni', 8204: 'zwnj', 8205: 'zwj', 8206: 'lrm', 8719: 'prod', 8721: 'sum', 8722: 'minus', 8211: 'ndash', 8212: 'mdash', 8727: 'lowast', 8216: 'lsquo', 8217: 'rsquo', 8730: 'radic', 175: 'macr', 8220: 'ldquo', 8221: 'rdquo', 8222: 'bdquo', 8224: 'dagger', 8225: 'Dagger', 8226: 'bull', 8230: 'hellip', 8743: 'and', 8744: 'or', 8745: 'cap', 8746: 'cup', 8747: 'int', 8240: 'permil', 8242: 'prime', 8243: 'Prime', 8756: 'there4', 8713: 'notin', 8249: 'lsaquo', 8250: 'rsaquo', 8764: 'sim', 62: 'gt', 8629: 'crarr', 9824: 'spades', 8260: 'frasl', 8773: 'cong', 8776: 'asymp', 8207: 'rlm', 9829: 'hearts', 8800: 'ne', 8801: 'equiv', 9827: 'clubs', 8804: 'le', 8805: 'ge', 9830: 'diams', 38: 'amp', 8834: 'sub', 8835: 'sup', 8836: 'nsub', 8838: 'sube', 8839: 'supe', 8853: 'oplus', 8855: 'otimes', 8734: 'infin', 8218: 'sbquo', 8901: 'sdot', 160: 'nbsp', 161: 'iexcl', 162: 'cent', 163: 'pound', 164: 'curren', 8869: 'perp', 166: 'brvbar', 167: 'sect', 168: 'uml', 169: 'copy', 170: 'ordf', 171: 'laquo', 8364: 'euro', 173: 'shy', 174: 'reg', 8733: 'prop', 176: 'deg', 177: 'plusmn', 178: 'sup2', 179: 'sup3', 180: 'acute', 181: 'micro', 182: 'para', 183: 'middot', 184: 'cedil', 185: 'sup1', 186: 'ordm', 187: 'raquo', 188: 'frac14', 189: 'frac12', 190: 'frac34', 191: 'iquest', 192: 'Agrave', 193: 'Aacute', 194: 'Acirc', 195: 'Atilde', 196: 'Auml', 197: 'Aring', 198: 'AElig', 199: 'Ccedil', 200: 'Egrave', 201: 'Eacute', 202: 'Ecirc', 203: 'Euml', 204: 'Igrave', 34: 'quot', 206: 'Icirc', 207: 'Iuml', 208: 'ETH', 209: 'Ntilde', 210: 'Ograve', 211: 'Oacute', 212: 'Ocirc', 213: 'Otilde', 214: 'Ouml', 215: 'times', 216: 'Oslash', 217: 'Ugrave', 218: 'Uacute', 219: 'Ucirc', 220: 'Uuml', 221: 'Yacute', 222: 'THORN', 223: 'szlig', 224: 'agrave', 225: 'aacute', 226: 'acirc', 227: 'atilde', 228: 'auml', 229: 'aring', 230: 'aelig', 231: 'ccedil', 232: 'egrave', 205: 'Iacute', 234: 'ecirc', 235: 'euml', 236: 'igrave', 8658: 'rArr', 238: 'icirc', 239: 'iuml', 240: 'eth', 241: 'ntilde', 242: 'ograve', 243: 'oacute', 244: 'ocirc', 245: 'otilde', 246: 'ouml', 247: 'divide', 248: 'oslash', 249: 'ugrave', 250: 'uacute', 251: 'ucirc', 252: 'uuml', 253: 'yacute', 254: 'thorn', 255: 'yuml', 172: 'not', 8968: 'lceil', 8969: 'rceil', 8970: 'lfloor', 8971: 'rfloor', 8465: 'image', 8472: 'weierp', 8476: 'real', 8482: 'trade', 732: 'tilde', 9002: 'rang', 8736: 'ang', 402: 'fnof', 8706: 'part', 8501: 'alefsym', 710: 'circ', 338: 'OElig', 339: 'oelig', 352: 'Scaron', 353: 'scaron', 8593: 'uarr', 60: 'lt', 8594: 'rarr', 8707: 'exist', 8595: 'darr', 8254: 'oline', 233: 'eacute', 376: 'Yuml', 916: 'Delta', 237: 'iacute', 8592: 'larr', 913: 'Alpha', 914: 'Beta', 915: 'Gamma', 8596: 'harr', 917: 'Epsilon', 918: 'Zeta', 919: 'Eta', 920: 'Theta', 921: 'Iota', 922: 'Kappa', 923: 'Lambda', 924: 'Mu', 925: 'Nu', 926: 'Xi', 927: 'Omicron', 928: 'Pi', 929: 'Rho', 931: 'Sigma', 932: 'Tau', 933: 'Upsilon', 934: 'Phi', 935: 'Chi', 936: 'Psi', 937: 'Omega', 945: 'alpha', 946: 'beta', 947: 'gamma', 948: 'delta', 949: 'epsilon', 950: 'zeta', 951: 'eta', 952: 'theta', 953: 'iota', 954: 'kappa', 955: 'lambda', 956: 'mu', 957: 'nu', 958: 'xi', 959: 'omicron', 960: 'pi', 961: 'rho', 962: 'sigmaf', 963: 'sigma', 964: 'tau', 965: 'upsilon', 966: 'phi', 967: 'chi', 968: 'psi', 969: 'omega', 9674: 'loz', 8656: 'lArr', 977: 'thetasym', 978: 'upsih', 8659: 'dArr', 8660: 'hArr', 982: 'piv', 165: 'yen', 8657: 'uArr', 9001: 'lang'}

Lo que tienes que hacer es recorrer tu texto y si el ord(caracter) se encuentra en el diccionario sustituirlo, sino dejarlo como esta. Que tienes que recorrer todo el texto, si ... quizás tienes razón que no es muy bonito y que probablemente con regular expressiones sería más rápido, pero vas a tener que meter todas las posibilidades que tienes en el diccionario.

Saludos,

Raúl

2012/6/5 Raimon Esteve <raimon...@gmail.com>



--
Raúl Cumplido

Jhonatan Sneider Salguero Villa

unread,
Jun 5, 2012, 8:24:49 AM6/5/12
to La lista de python en castellano
puedes usar los métodos encode y decode de los strings, encode admite un segundo parametro
donde se indica como manejar los errores a la hora de codificar, si usas xmlcharrefreplace
este los reemplaza por su caracteres xml.

"á é í ó ú ñ".decode("utf-8").encode("ascii", "xmlcharrefreplace")

devuelve

'&#225; &#233; &#237; &#243; &#250; &#241;' 

Héctor Herrera

unread,
Jun 5, 2012, 8:25:40 AM6/5/12
to La lista de python en castellano
No soy experto ni mucho menos en Python, pero, has pensado en mirar con expresiones regulares el tema? Me refiero, busca una coincidencia de una tilde, por ejemplo, y reemplázala con un tilde formateado en HTML. Esto lo puedes hacer con una herramienta de Linux llamada sed (que es lo que uso yo) o te puedes construír tu propia herramienta en Python...

http://www.vicente-navarro.com/blog/2007/04/13/expresiones-regulares-en-la-shell-ejemplos-de-uso-con-grep-awk-y-sed/
Este link te puede servir, informa sobre las expresiones regulares. Está aplicado a bash, pero creo que se puede llevar a Python
--
Saludos

Héctor Herrera Anabalón
Egresado ICCI UNAP
Soporte IT en CNN Chile
Miembro USoLIX Victoria
Registered User #548600 (LinuxCounter.net)
+56983118902


Daπid

unread,
Jun 5, 2012, 8:42:29 AM6/5/12
to La lista de python en castellano
2012/6/5 Raúl Cumplido <raulcu...@gmail.com>:
> probablemente con regular expressiones sería más rápido, pero vas a tener
> que meter todas las posibilidades que tienes en el diccionario.

Siempre puedes escribir código que te genere todo ese código en re.

G V

unread,
Jun 5, 2012, 9:54:16 AM6/5/12
to La lista de python en castellano
otra opcion:
1) expresión regular que te saque la lista ordenada de los caracteres
a transformar
2) sustituir los caracteres a transformar por %s
3) mapear una funcion de traduccion a la lista del punto 1
4) texto_del_pto_2 % lista_pto_3

2012/6/5 Daπid <david...@gmail.com>:

Rock Neurotiko

unread,
Jun 5, 2012, 9:59:22 AM6/5/12
to La lista de python en castellano
Yo creo que no hay que darle muchas vueltas al tema, puede que escrito quede más "bonito", pero la expresion regular, dentro de lo que cabe, seguirá recorriendo todo el string, incluso lo tendras que recorrer mas veces, una por cada substitución.
Van a ser de la misma complejidad, O(n), o incluso la de expresiones regulares seria O(k*n).

Asi que yo usaría la libreria de python.
--
Miguel García Lafuente - Rock Neurotiko
Vocal de la Junta Directiva Nacional del Partido Pirata.
Coordinador de Jóvenes Piratas en Madrid.

"Libertad en lugar de miedo." - "Información libre, sociedad libre."

El contenido de este e-mail es privado, no se permite la revelacion del contenido de este e-mail a gente ajena a él.

Chema Cortes

unread,
Jun 5, 2012, 1:40:47 PM6/5/12
to La lista de python en castellano
El día 5 de junio de 2012 15:59, Rock Neurotiko
<miguelg...@gmail.com> escribió:
> Yo creo que no hay que darle muchas vueltas al tema, puede que escrito quede
> más "bonito", pero la expresion regular, dentro de lo que cabe, seguirá
> recorriendo todo el string, incluso lo tendras que recorrer mas veces, una
> por cada substitución.
> Van a ser de la misma complejidad, O(n), o incluso la de expresiones
> regulares seria O(k*n).

No estoy de acuerdo. Muchas librerías, como la de las expresiones
regulares, se programan y optimizan en C con lo que su uso puede
resultar muy eficiente. Pero en el caso concreto de las expresiones
regulares, se pueden combinar todos los caracteres a buscar en una
sóla cadena de búsqueda con lo que sólo recorrer la cadena una sóla
vez:

import re
from htmlentitydefs import codepoint2name

u2n=dict((unichr(k),v) for (k,v) in codepoint2name.items())

pat=re.compile('['+"".join(u2n.keys())+']')

def repl(m):
return '&'+u2n[m.group(0)]+';'

print( pat.sub(repl, u"áÁ éÉ íÍ óÓ úÚ ñÑ çÇ €") )


Este uso muestra muy poco del potencial que tienen las expresiones
regulares. Para el caso que nos ocupa, posiblemente existan otras
soluciones más rápidas y elegantes de hacer lo mismo, o incluso tan
crípticas como ésta:

print( "".join( ('&'+u2n[c]+';') if ord(c) in u2n else c for c in
u""áÁ éÉ íÍ óÓ úÚ ñÑ çÇ €") )

...que viene a ser una solución "compacta" de las ya propuestas en
mensajes anteriores.


--
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales

Rock Neurotiko

unread,
Jun 5, 2012, 1:50:35 PM6/5/12
to La lista de python en castellano
Tienes razon, por eso digo "incluso lo tendras que recorrer", porque una de dos, o te haces el pedazo de expresion regular con todos los casos, o las vas haciendo mas pequeñas.

De todas formas, se supone que Python debería ser legible, y para mi las expresiones regulares muy crípticas (la que has puesto todavia se entiende) no son muy legibles, pero bueno, cada uno hace con su codigo lo que quiere xD

Luis Miguel Morillas

unread,
Jun 5, 2012, 2:29:24 PM6/5/12
to La lista de python en castellano
El día 5 de junio de 2012 13:53, Raimon Esteve
<raimon...@gmail.com> escribió:
> Hola,
>
> he leido de todo y nada me ha gustado. Como convertís un string utf8 a
> un string con carácteres html? o sea, que los accentos se transformen
> a codificación html?
>
> En este pequeño código, convertimos á é í ó ú ñ -> a htm entities.
> Pero falta mayúsculas, ç (catalán), ....
>

Yo uso un parser de xml/html y un writer para HTML

>>> from amara.bindery import html
>>> from amara.writers import lookup
>>> HTML_W = lookup("html")
>>> doc = html.parse('<p>Caña áéíóú ç</p>')
>>> doc.xml_encode(HTML_W)
'<html><head></head><body><p>Ca&ntilde;a
&aacute;&eacute;&iacute;&oacute;&uacute; &ccedil;</p></body></html>'


Saludos,

-- luismiguel  (@lmorillas)

FERNANDEZ HERNANDEZ GONZALO

unread,
Jun 5, 2012, 4:29:22 PM6/5/12
to La lista de python en castellano
Y no se podría hacer algo con maketrans y translate de string?



_______________________________________________________________

Gonzalo Fernández Hernández





gfern...@tecnatom.es


Avda. Montes de Oca, 1
28703 San Sebastián de los Reyes-Madrid
Telf. 91 659 86 00 / 8205



________________________________________
De: python-es-bounces+gfernandez=tecna...@python.org [python-es-bounces+gfernandez=tecna...@python.org] En nombre de Luis Miguel Morillas [mori...@gmail.com]
Enviado el: martes, 05 de junio de 2012 20:29
Para: La lista de python en castellano
Asunto: Re: [Python-es] Convertir utf8 a html entities
______________________________________________________________________
This email has been scanned by the Email Security System.
______________________________________________________________________


Si no es necesario no imprimas este mensaje. Tu papel es importante

Le invitamos a visitar nuestra página Web: <http://www.tecnatom.es>
INFORMACION RELATIVA A LA L.O.P.D.:
En cumplimiento de la Ley Orgánica 15/1999, de Protección de Datos de Carácter Personal, en el caso de que este mensaje contenga datos de carácter personal se requiere a su destinatario que los utilice exclusivamente para el objeto previamente acordado con TECNATOM S.A., garantice su secreto e integridad, no los ceda a terceras personas y los destruya una vez finalizada la vigencia de la colaboración con TECNATOM, S.A.
Salvo comunicación expresa en contra por parte del destinatario, se considerará la aceptación plena de lo referido en el párrafo anterior.

AVISO DE CONFIDENCIALIDAD:
Este mensaje va dirigido, de manera exclusiva, a su destinatario y contiene información confidencial y sujeta al secreto profesional, cuya divulgación no está permitida por la ley. En caso de haber recibido este mensaje por error, le rogamos que, de forma inmediata, nos lo comunique mediante correo electrónico remitido a nuestra atención y proceda a su eliminación, así como a la de cualquier documento adjunto al mismo. Asimismo, le comunicamos que la distribución, copia o utilización de este mensaje, o de cualquier documento adjunto al mismo, cualquiera que fuera su finalidad, están prohibidas por la ley.


______________________________________________________________________
This email has been scanned by the Email Security System.
______________________________________________________________________

Luis Miguel Morillas

unread,
Jun 5, 2012, 4:46:21 PM6/5/12
to La lista de python en castellano
El día 5 de junio de 2012 22:29, FERNANDEZ HERNANDEZ GONZALO
<gfern...@tecnatom.es> escribió:
> Y no se podría hacer algo con maketrans y translate de string?
>
>

Claro que se puede hacer. El que quiera reinventar la rueda, que
traduzca: http://www.w3.org/TR/html4/sgml/entities.html

Saludos,

-- luismiguel  (@lmorillas)

FERNANDEZ HERNANDEZ GONZALO

unread,
Jun 6, 2012, 3:09:57 AM6/6/12
to La lista de python en castellano
Estaba pensando en algo así (basándome en el mensaje de Chema):

from html.entities import codepoint2name

u2n = dict((chr(k),"&{0};".format(v)) for (k,v) in codepoint2name.items())

transformation = str.maketrans(u2n)
result = "áéíóú<>".translate(transformation)
print(result)

PD: Perdonad mi python 3




_______________________________________________________________

Gonzalo Fernández Hernández





gfern...@tecnatom.es


Avda. Montes de Oca, 1
28703 San Sebastián de los Reyes-Madrid
Telf. 91 659 86 00 / 8205



-----Mensaje original-----
De: python-es-bounces+gfernandez=tecna...@python.org [mailto:python-es-bounces+gfernandez=tecna...@python.org] En nombre de Luis Miguel Morillas
Enviado el: martes, 05 de junio de 2012 22:46

FERNANDEZ HERNANDEZ GONZALO

unread,
Jun 6, 2012, 3:25:02 AM6/6/12
to La lista de python en castellano
Acabo de ver:

http://docs.python.org/release/3.1.5/library/xml.sax.utils.html





_______________________________________________________________

Gonzalo Fernández Hernández





gfern...@tecnatom.es


Avda. Montes de Oca, 1
28703 San Sebastián de los Reyes-Madrid
Telf. 91 659 86 00 / 8205



-----Mensaje original-----
De: python-es-bounces+gfernandez=tecna...@python.org [mailto:python-es-bounces+gfernandez=tecna...@python.org] En nombre de FERNANDEZ HERNANDEZ GONZALO
Enviado el: miércoles, 06 de junio de 2012 9:10

Raimon Esteve

unread,
Jun 6, 2012, 2:02:26 PM6/6/12
to La lista de python en castellano
Bueno ¿y el ganador es ......?

>>> from htmlentitydefs import codepoint2name
>>> str = u'Això és un cançò'
>>> ''.join([ord(c) in codepoint2name and "&%s;" % codepoint2name[ord(c)] or c for c in str])
u'Aix&ograve; &eacute;s un can&ccedil;&ograve;'

Lo dejamos así, Almenos ha quedado compacto ;)

Saludos.

Chema Cortes

unread,
Jun 6, 2012, 9:42:55 PM6/6/12
to La lista de python en castellano
El 2012/6/6 Raimon Esteve <raimon...@gmail.com> escribió:
> Bueno ¿y el ganador es ......?
>
>>>> from htmlentitydefs import codepoint2name
>>>> str = u'Això és un cançò'
>>>> ''.join([ord(c) in codepoint2name and "&%s;" % codepoint2name[ord(c)] or c for c in str])
> u'Aix&ograve; &eacute;s un can&ccedil;&ograve;'
>
> Lo dejamos así, Almenos ha quedado compacto ;)

Pues aún se puede compactar más usando "generadores" (y más eficiente):

''.join(ord(c) in codepoint2name and "&%s;" % codepoint2name[ord(c)]
or c for c in str)

..aún más usando el operador ternario:

''.join("&%s;"%codepoint2name[ord(c)] if ord(c) in codepoint2name else
c for c in str)


A pesar de todo, prefiero que sea legible a costa de más líneas:

def fmt(c):
r=codepoint2name.get(ord(c),c)
return r if len(r)==1 else "&"+r+";"

print ''.join(fmt(c) for c in s)



--
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales
Reply all
Reply to author
Forward
0 new messages