[Python-es] Entity 'aacute' not defined

Chema Cortes pych3m4 en gmail.com
Lun Mayo 18 10:50:30 CEST 2015


El 18 de mayo de 2015, 6:01, Miguel Beltran R. <yourpadre en gmail.com>
escribió:

> Tambien es otra buena libreria, dependiendo que quieras y con que cuentes
> para hacerlo.
>
> Yo trabaje con lxml en lugar de Beatifulsoup pero no recuerdo porque.
>

Ambas dos pueden usar el "parser" de la otra. En general, BeutifulSoup es
más sencilla de instalar y suele ser suficiente para cualqueir cometido. Se
recomienda usarlo siempre con una versión actualizada de python, ya que el
parser HTML estándar era algo defectuoso en versiones antiguas.

El lxml es más rápido y es más tolerante a código HTML mal construido. En
cambio, sus dependencias con librerías C podrían hacerlo menos
"transportable", y puede tener problemas con ciertas codificaciones de
caracteres.

El problema de las "entidades" creo que alguna vez me lo he encontrado,
pero no recuerdo cómo lo resolví. Mi recomendación es que, en lugar de
googlear, busques directamente en el código de algunos proyectos. Por
ejemplo, calibre usa beautifulsoup y lxml:
https://github.com/kovidgoyal/calibre , donde puedes ver que utiliza una
relación explícita de entidades que no tener problemas.




>
> El 16 de mayo de 2015, 17:41, Alberto Perez <ksian1685 en gmail.com>
> escribió:
>
>> Creo que BeautifulSoup hace todo por mí
>>
>> 2015-05-16 15:30 GMT-03:00 Alberto Perez <ksian1685 en gmail.com>:
>>
>> Miguel Beltra:
>>> La verdad que nunca me puse a investigar sobre lxml. Ya me pongo a
>>> googlear sobre el tema. Quizás tenes razón.
>>> Gracias.
>>>
>>> 2015-05-16 14:11 GMT-03:00 Miguel Beltran R. <yourpadre en gmail.com>:
>>>
>>> Parece que tienes algo en tu función "escape" que modifica la pagina (en
>>>> etree.XML(escape(tablas)))
>>>>
>>>> "aacute" deberia ser "á"  que se muetra como "á"
>>>>
>>>> Otra cosa es que no creo que sea conveniente usar expreciones
>>>> regulares, ¿seguro que no lo puedes hacer usando solo el selector de lxml?
>>>>
>>>> El 7 de mayo de 2015, 19:10, Alberto Perez <ksian1685 en gmail.com>
>>>> escribió:
>>>>
>>>>> Hola,
>>>>>
>>>>> Soy nuevo en python y siempre tuve problemas con el uso de expresiones
>>>>> regulares, sin embargo me animé a escribir un pequeño script que haga un
>>>>> par de peticiones ¨POST para obtener información de una página. El problema
>>>>> es que me arrojaba el siguiente error:  lxml.etree.XMLSyntaxError:
>>>>> Entity 'aacute' not defined, line 1, column 3747
>>>>>
>>>>> Googlé y descubrí que tengo que habilitar aacute en <!DOCTYPE> o algo
>>>>> así, probé con la librería codecs, pero no sé muy bien cómo usarla, porque
>>>>> me tira diferentes errores. Finalmente creí dar con la solución cuando usé
>>>>> “escape” que me arrojó: lxml.etree.XMLSyntaxError: Start tag
>>>>> expected, '<' not found, line 1, column 1
>>>>>
>>>>> solo debería borrar el carácter ese que está de más, entonces probé
>>>>> recorrer la variable usando la siguiente expresión:
>>>>>
>>>>>     variable2=(escape(variable2)).replace(*">>"*,*">"*)
>>>>>
>>>>>     variable2=(escape(variable2)).replace(*"<<"*,*"<"*)
>>>>>
>>>>> Más pienso el código y más me convenzo que mi problema está en el uso
>>>>> de expresiones regulares. Si quieren echar un vistazo, les dejo el código.
>>>>> Si a alguien se les ocurre una expresion regular que ponga fin a mi
>>>>> problema, gracias, sino dejaré el código en mi escritorio para cuando gane
>>>>> mayor experiencia en python
>>>>>
>>>>>
>>>>>
>>>>> import *httplib*, urllib, urllib2, re, *xml*, *codecs*, *unicodedata*
>>>>>
>>>>> from lxml import etree
>>>>>
>>>>> from lib2to3.fixer_util import *String*
>>>>>
>>>>> from xml.sax.saxutils import escape
>>>>>
>>>>>
>>>>>
>>>>> def *conectar*(CALLE, ALTURA):
>>>>>
>>>>>
>>>>>
>>>>>     tablas_abre=*"<table>"*
>>>>>
>>>>>     tablas_cierra=*"</table>"*
>>>>>
>>>>>
>>>>>
>>>>>     parametros = urllib.urlencode({*'CALLE'*: CALLE,*'ALTURA'*:
>>>>> ALTURA,*'dedonde'*: *'fonos'*})
>>>>>
>>>>>     i=1
>>>>>
>>>>>     h_cookie=urllib2.HTTPCookieProcessor()
>>>>>
>>>>>     opener= urllib2.build_opener(h_cookie)
>>>>>
>>>>>     #f = urllib2.*urlopen*("
>>>>> http://www.webdedatos.com/ZIPs/cpas/zipscalles.php", *parametros*)
>>>>>
>>>>>     urllib2.install_opener(opener)
>>>>>
>>>>>     f=urllib2.urlopen(*"http://www.webdedatos.com/ZIPs/cpas/zipscalles.php
>>>>> <http://www.webdedatos.com/ZIPs/cpas/zipscalles.php>"*, parametros);
>>>>>
>>>>>     #print f.read()
>>>>>
>>>>>     aux=f.read()
>>>>>
>>>>>     veces=int(cantidad(aux))
>>>>>
>>>>>
>>>>>
>>>>>     t=traer_solo_tabla(aux)
>>>>>
>>>>>
>>>>>
>>>>>     #*cabeceras* = {"Content-type": "application/x-*www*-form-
>>>>> *urlencoded*","Accept": "text/plain"}
>>>>>
>>>>>     #abrir_conexion = httplib.HTTPConnection("www.webdedatos.com:80")
>>>>>
>>>>>     #abrir_conexion.request("POST", "/ZIPs/*cpas*/zipscalles.php",
>>>>> *parametros*, *cabeceras*)
>>>>>
>>>>>     #*respuesta* = abrir_conexion.getresponse()
>>>>>
>>>>>     #print respuesta.status
>>>>>
>>>>>     i+1;
>>>>>
>>>>>     while(i<=veces):
>>>>>
>>>>>         f = urllib2.urlopen(*"http://www.webdedatos.com/ZIPs/cpas/zipscalles.php?verPagina=
>>>>> <http://www.webdedatos.com/ZIPs/cpas/zipscalles.php?verPagina=>"*
>>>>> +str(veces))
>>>>>
>>>>>         veces=veces-1
>>>>>
>>>>>         aux3=f.read()
>>>>>
>>>>>         t+=traer_solo_tabla(aux3)
>>>>>
>>>>>     tablas=tablas_abre+t+tablas_cierra
>>>>>
>>>>>     #print f.read()
>>>>>
>>>>>     #t+=f.read()
>>>>>
>>>>>
>>>>>
>>>>>     return tablas
>>>>>
>>>>>
>>>>>
>>>>> def *cantidad*(sitio):
>>>>>
>>>>>     vari = re.search(*"1 de.+</center></b><center>"*,sitio)
>>>>>
>>>>>     sub_palabra = vari.group(0)
>>>>>
>>>>>     sub_palabra = sub_palabra.replace(*"1 de"*,*" "*)
>>>>>
>>>>>     sub_palabra = sub_palabra.replace(*"</center></b><center>"*,*" "*)
>>>>>
>>>>>     return sub_palabra
>>>>>
>>>>>
>>>>>
>>>>> def *traer_solo_tabla*(variable):
>>>>>
>>>>>     vari = re.search(*"<br><tr><td ALIGN=...+"*,variable)
>>>>>
>>>>>     variable2 = vari.group()
>>>>>
>>>>>
>>>>>
>>>>>     variable2=variable2.replace(*"<br>"*,*" "*)
>>>>>
>>>>>
>>>>>
>>>>>     variable2=variable2.replace(*"<table>"*,*" "*)
>>>>>
>>>>>     variable2=variable2.replace(*"</table>"*,*" "*)
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>     variable2=variable2.replace(*"<center>"*,*" "*)
>>>>>
>>>>>     variable2=variable2.replace(*"</center>"*,*" "*)
>>>>>
>>>>>     variable2=(escape(variable2)).replace(*">>"*,*">"*)
>>>>>
>>>>>     variable2=(escape(variable2)).replace(*"<<"*,*"<"*)
>>>>>
>>>>>
>>>>>
>>>>>     regexp=re.compile(*"<a
>>>>> href=..........................................>"*)
>>>>>
>>>>>     variable2=regexp.sub(*" "*,variable2)
>>>>>
>>>>>     variable2=variable2.replace(*"</a>"*,*" "*)
>>>>>
>>>>>     return variable2
>>>>>
>>>>>
>>>>>
>>>>> def *imprimir*(tablas, BARRIO):
>>>>>
>>>>>     #el codigo de imprimir lo copie de un foro solo le agregué escape
>>>>> para saber cual era el error
>>>>>
>>>>>     print tablas
>>>>>
>>>>>     tabla = etree.XML(escape(tablas))
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>     rows = iter(tabla)
>>>>>
>>>>>     *headers* = [col.text for col in next(rows)]
>>>>>
>>>>>     for row in rows:
>>>>>
>>>>>         values = [col.text for col in row]
>>>>>
>>>>>         if(values[4]==BARRIO):
>>>>>
>>>>>             print values
>>>>>
>>>>>
>>>>>
>>>>> def *main*():
>>>>>
>>>>>
>>>>>
>>>>>     ALTURA = int(input(*"ingrese la altura de la calle: "*))
>>>>>
>>>>>     CALLE = raw_input(*"ingrese el nombre de la calle: "*)
>>>>>
>>>>>     BARRIO = raw_input(*"ingrese el nombre del barrio: "*)
>>>>>
>>>>>
>>>>>
>>>>>     respuesta=conectar(CALLE, ALTURA)
>>>>>
>>>>>     imprimir(respuesta, BARRIO)
>>>>>
>>>>>
>>>>>
>>>>>     #print *tablas*
>>>>>
>>>>>
>>>>>
>>>>> if __name__ == *'__main__'*:
>>>>>
>>>>>     main()
>>>>>
>>>>>
>>>>> Desde ya, muchas gracias.
>>>>>
>>>>> _______________________________________________
>>>>> Python-es mailing list
>>>>> Python-es en python.org
>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> ________________________________________
>>>> Lo bueno de vivir un dia mas
>>>> es saber que nos queda un dia menos de vida
>>>>
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> Python-es en python.org
>>>> https://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>>>
>>>
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
>
> --
> ________________________________________
> Lo bueno de vivir un dia mas
> es saber que nos queda un dia menos de vida
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>


-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20150518/3179e042/attachment.html>


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