[pyar] xml.etree.ElementTree

Augusto adtononi en gmail.com
Mie Dic 18 15:02:54 -03 2019


Intenta usar response.content en vez de response.text, te va a devolver el
body en bytes

El mié., 18 dic. 2019 14:36, Federico Brest <federiconbrest en gmail.com>
escribió:

> Muchas gracias por la pronta respuesta y el aguante!!
> Compila perfecto, pero me estoy encontrando con el siguiente error:
> "Unicode strings with encoding declaration are not supported. Please use
> bytes input or XML fragments without declaration. "
> Sabes cómo resolverlo?
>
> El mié., 18 dic. 2019 a las 14:11, Augusto (<adtononi en gmail.com>)
> escribió:
>
>> Es: from lxml import html as lxmlhtml
>> Después podes usar lxmlhtml.fromstring, si no me equivoco
>>
>>
>> El mié., 18 dic. 2019 12:09, Federico Brest <federiconbrest en gmail.com>
>> escribió:
>>
>>> Buenas! Hice lo que me recomendaste Agusto, y no me reconoce un módulo
>>> de fromstring...me comí algo?
>>> Va el código en cuestión:
>>>
>>> #import json
>>> import requests
>>> import io
>>> import xml.etree.ElementTree as ET
>>> import lxml
>>> import html as lxmlhtml
>>> from lxml.html import fromstring
>>>
>>> def validar_cuit(cuit):
>>>     # validaciones minimas
>>>     if len(cuit) != 11:
>>>         #print("False")
>>>         return False
>>>
>>>     base = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
>>>
>>>     #cuit = cuit.replace("-", "")
>>>
>>>     # calculo el digito verificador:
>>>     aux = 0
>>>     for i in range(10):
>>>         aux += int(cuit[i]) * base[i]
>>>
>>>     aux = 11 - (aux - (int(aux / 11) * 11))
>>>
>>>     if aux == 11:
>>>         aux = 0
>>>     if aux == 10:
>>>         aux = 9
>>>
>>>     #print("True")
>>>     return aux == int(cuit[10])
>>>
>>> def getInfoFromApi(cuit):
>>>     custom_header = {
>>>         'usuario_apikey':
>>> "QWTERT2syVkQ2NW1UN2c3MWNQeWEWFWEFWExVRnJVUT09",
>>>         'Cookie':
>>> "__cfduid=de5890d2d1645d87b18692a6sdfsdfgdfhdad91d6adf1576011069;
>>> MIPROVEEDOR=l5r3dteuh2rkgwerwerfde4t9qm85tl8sm; ROUTEID=.1",
>>>     }
>>>
>>>     url = 'https://informe.mirproveedor.com/api/informes/solicitar/' +
>>> str(cuit)
>>>     args = {'formato':'xml', 'procesar_forzado':'1', 'cuit': cuit }
>>>
>>>     source_code = requests.get(url, headers=custom_header,
>>> data=args).text
>>>     tree = lxmlhtml.fromstring(source_code)
>>>
>>>     #response = requests.get(url, headers=custom_header, data=args)
>>>     #tree = ET.parse(response.text)
>>>     #root = tree.getroot()
>>>     #content = response.json()
>>>
>>>     print("-- Status Code:", response.status_code)
>>>
>>>     return content
>>>
>>> def saveInfo(content, filename):
>>>     '''with io.open(filename, 'w', encoding='utf8') as file:
>>>         #json.dump(content, file, indent=4, ensure_ascii=False)
>>>         file.write(response.text)
>>>
>>>         #Process XML here
>>>         #tree.write('file-after-edits.xml', encoding='utf8')
>>>     '''
>>>     with open(filename, 'w', encoding = 'utf-8') as filexml:
>>>         filexml.write(tree)
>>>         filexml.close()
>>>
>>>
>>> def prettify(elem):
>>>     # Devuelve un XML impreso formateado y string del elemento
>>>     rough_string = ElementTree.tostring(elem, 'utf-8')
>>>     reparsed = minidom.parseString(rough_string)
>>>     return reparsed.toprettyxml(indent="\t")
>>>
>>>
>>> if __name__ == '__main__':
>>>     cuit = input("Ingrese un numero de cuit: ")
>>>
>>>     print("- Obteniendo información de", cuit)
>>>     info = getInfoFromApi(cuit)
>>>
>>>     cuitValido = validar_cuit(cuit)
>>>     if cuitValido == False:
>>>         print("El Cuit ",cuit," es Invalido")
>>>         print("Presione una tecla para Finalizar...")
>>>         msvcrt.getch()
>>>     else:
>>>         print("cuil válido")
>>>
>>>     filename = cuit + '.xml'
>>>     saveInfo(info, filename)
>>>     print("- Guardado en", filename)
>>>
>>>     print("Presione una tecla para finalizar...")
>>>     msvcrt.getch()
>>>
>>> El lun., 16 dic. 2019 a las 16:18, Augusto (<adtononi en gmail.com>)
>>> escribió:
>>>
>>>> Entonces hace lo siguiente:
>>>>
>>>> Leete esa librería y crea un XML puro, es decir creando nodos (no te
>>>> olvides de utilizar CDATA, está en la documentación también). A estos nodos
>>>> insertale la data que extraigas usando las expresiones Xpath (tenes una
>>>> extensión para el buscador llamada TryXpath, literal pegas la expresión y
>>>> marca a que elemento corresponde, dicha expresión después la pegas en el
>>>> script de python).
>>>>
>>>> Esto es scrapeo web, vas a econtrar tutoriales para scrapear y meter la
>>>> info en una tabla, hay miles.
>>>>
>>>> Suerte!
>>>>
>>>>
>>>> El lun., 16 dic. 2019 a las 16:10, Federico Brest (<
>>>> federiconbrest en gmail.com>) escribió:
>>>>
>>>>>
>>>>>> Olvide indicar, que la importo así
>>>>>>
>>>>>
>>>>>> from lxml import html as lxmlhtml
>>>>>>>
>>>>>>
>>>>> Jajaja tranqui, lo di por sentado.
>>>>>
>>>>>>
>>>>>> El lun., 16 dic. 2019 a las 16:06, Augusto (<adtononi en gmail.com>)
>>>>>> escribió:
>>>>>>
>>>>>>> Depende qué quieras guardar en el .xml.
>>>>>>> Yo trabaje con la librería lxml, y para obtener el source code tal
>>>>>>> como está en el navegador hago lo siguiente:
>>>>>>>
>>>>>>> source_code = requests.get(url, headers=headers).text
>>>>>>>>  tree = lxmlhtml.fromstring(source_code)
>>>>>>>>
>>>>>>>
>>>>>>> Después utilizando expresiones Xpath obtengo la información
>>>>>>> específica que yo quiero. En mi caso trabaje con noticias, entonces de todo
>>>>>>> el contenido solo extraía el título, fecha, texto, etc.
>>>>>>>
>>>>>>> No entiendo por qué necesitarías el source completo, pero de
>>>>>>> necesitarlo entonces hace:
>>>>>>>
>>>>>>> with open(filename, 'w', encoding = 'utf-8') as filexml:
>>>>>>>>     filexml.write(tree) # o donde hayas metido el
>>>>>>>> requests.get().text
>>>>>>>>     filexml.close()
>>>>>>>>
>>>>>>>
>>>>>>> Eso solo para guardar el texto, ya después tenes las funciones
>>>>>>> propias de lxml para crear los nodos (esto si extraes info específica y
>>>>>>> querés ordenarla de determinada manera)
>>>>>>>
>>>>>>
>>>>> Buenisimo!! cualquiera de las 2 cosas me vienen muy bien porque la
>>>>> idea es después guardar en una tabla solo un par de campos (es largo de
>>>>> explicar, pero basicamente lo que estoy haciendo es un parche porque el
>>>>> sistema original es una porqueria y no esta desarrollado en python (ni en
>>>>> ningun lenguaje conocido, es Genexus), y este no permite interactuar con
>>>>> APIs, sólo usando WS...una caca.
>>>>> PD: Nunca traten de arreglar sistemas feos que la empresa contrató a
>>>>> proveedores que desarrollen (no existía sistemas hasta que llegué yo...y
>>>>> asi estamos, je).
>>>>>
>>>>> Muchas gracias !!!
>>>>>
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> El lun., 16 dic. 2019 a las 15:28, Federico Brest (<
>>>>>>> federiconbrest en gmail.com>) escribió:
>>>>>>>
>>>>>>>>
>>>>>>>> Tenes un problema con las variables también. En la función save le
>>>>>>>>> pasas content y filename, pero después intentas guardar response.text, de
>>>>>>>>> donde sale eso?
>>>>>>>>>
>>>>>>>>
>>>>>>>> La verdad es que ya no me acuerdo jajaja
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Yo te recomiendo que generes el xml al momento que obtenés la info
>>>>>>>>> de la API, y no hacer las cosas por separado.
>>>>>>>>>
>>>>>>>>
>>>>>>>> Buen consejo! como sería el código entonces?
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>> El lun., 16 dic. 2019 15:04, Federico Brest <
>>>>>>>>> federiconbrest en gmail.com> escribió:
>>>>>>>>>
>>>>>>>>>> Cuidado con comprartir las credenciales de la API, esa parte no
>>>>>>>>>>> hace falta.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> No hay problema con eso, fueron caracteres alfanuméricos
>>>>>>>>>> colocados al azar, no son credenciales verdaderas
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Después, tu función getInfoFromApi no devuelve nada. Fijate que
>>>>>>>>>>> tenes comentada la línea del content
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Si, me percaté de ese detalle y lo descomenté. Aun asi falla la
>>>>>>>>>> funcionalidad de escribir el archivo XML
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Tu idea es parar todo el source code de la página a un xml?
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> La idea es almacenar en un XML la respuesta recibida de la API
>>>>>>>>>>
>>>>>>>>>> Cualquier ayuda que puedan brindar es más que bienvenida :)
>>>>>>>>>> Saludos,
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> El lun., 16 dic. 2019 11:19, Federico Brest <
>>>>>>>>>>> federiconbrest en gmail.com> escribió:
>>>>>>>>>>>
>>>>>>>>>>>> Muchas gracias por responder tan pronto :)
>>>>>>>>>>>> Va de nuevo el código completo:
>>>>>>>>>>>>
>>>>>>>>>>>> #import json
>>>>>>>>>>>> import requests
>>>>>>>>>>>> import io
>>>>>>>>>>>> import xml.etree.ElementTree as ET
>>>>>>>>>>>>
>>>>>>>>>>>> def validar_cuit(cuit):
>>>>>>>>>>>>     # validaciones minimas
>>>>>>>>>>>>     if len(cuit) != 11:
>>>>>>>>>>>>         #print("False")
>>>>>>>>>>>>         return False
>>>>>>>>>>>>
>>>>>>>>>>>>     base = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
>>>>>>>>>>>>
>>>>>>>>>>>>     #cuit = cuit.replace("-", "") # remuevo las barras
>>>>>>>>>>>>
>>>>>>>>>>>>     # calculo el digito verificador:
>>>>>>>>>>>>     aux = 0
>>>>>>>>>>>>     for i in range(10):
>>>>>>>>>>>>         aux += int(cuit[i]) * base[i]
>>>>>>>>>>>>
>>>>>>>>>>>>     aux = 11 - (aux - (int(aux / 11) * 11))
>>>>>>>>>>>>
>>>>>>>>>>>>     if aux == 11:
>>>>>>>>>>>>         aux = 0
>>>>>>>>>>>>     if aux == 10:
>>>>>>>>>>>>         aux = 9
>>>>>>>>>>>>
>>>>>>>>>>>>     #print("True")
>>>>>>>>>>>>     return aux == int(cuit[10])
>>>>>>>>>>>>
>>>>>>>>>>>> def getInfoFromApi(cuit):
>>>>>>>>>>>>     custom_header = {
>>>>>>>>>>>>         'usuario_apikey':
>>>>>>>>>>>> "Q2syVkQ2NW1UN2c3MWREWGSDDSWNQeWxVRnJVUT09",
>>>>>>>>>>>>         'Cookie':
>>>>>>>>>>>> "__cfduid=de5890d2d1645d87b18692a6ad91d6adsrtvcsf1576011069;
>>>>>>>>>>>> PROVEEDOR=l5r3dteuh2rkge4t9qm85tl8sm; ROUTEID=.1",
>>>>>>>>>>>>     }
>>>>>>>>>>>>
>>>>>>>>>>>>     url = '
>>>>>>>>>>>> https://informe.unproveedor.com/api/informes/solicitar/' +
>>>>>>>>>>>> str(cuit)
>>>>>>>>>>>>     args = {'formato':'xml', 'procesar_forzado':'1', 'cuit':
>>>>>>>>>>>> cuit }
>>>>>>>>>>>>
>>>>>>>>>>>>     response = requests.get(url, headers=custom_header,
>>>>>>>>>>>> data=args)
>>>>>>>>>>>>     tree = ET.parse(response.text)
>>>>>>>>>>>>     root = tree.getroot()
>>>>>>>>>>>>     #content = response.json()
>>>>>>>>>>>>
>>>>>>>>>>>>     print("-- Status Code:", response.status_code)
>>>>>>>>>>>>
>>>>>>>>>>>>     return content
>>>>>>>>>>>>
>>>>>>>>>>>> def saveInfo(content, filename):
>>>>>>>>>>>>     with io.open(filename, 'w', encoding='utf8') as file:
>>>>>>>>>>>>         #json.dump(content, file, indent=4, ensure_ascii=False)
>>>>>>>>>>>>         file.write(response.text)
>>>>>>>>>>>>
>>>>>>>>>>>> if __name__ == '__main__':
>>>>>>>>>>>>     cuit = input("Ingrese un numero de cuit: ")
>>>>>>>>>>>>
>>>>>>>>>>>>     print("- Obteniendo información de", cuit)
>>>>>>>>>>>>     info = getInfoFromApi(cuit)
>>>>>>>>>>>>
>>>>>>>>>>>>     cuitValido = validar_cuit(cuit)
>>>>>>>>>>>>     if cuitValido == False:
>>>>>>>>>>>>         print("El Cuit ",cuit," es Invalido")
>>>>>>>>>>>>         print("Presione una tecla para Finalizar...")
>>>>>>>>>>>>         msvcrt.getch()
>>>>>>>>>>>>     else:
>>>>>>>>>>>>         print("cuil válido")
>>>>>>>>>>>>
>>>>>>>>>>>>     filename = cuit + '.xml'
>>>>>>>>>>>>     saveInfo(info, filename)
>>>>>>>>>>>>     print("- Guardado en", filename)
>>>>>>>>>>>>
>>>>>>>>>>>>     print("Presione una tecla para finalizar...")
>>>>>>>>>>>>     msvcrt.getch()
>>>>>>>>>>>>
>>>>>>>>>>>> Abrazo, y nuevamente muchas gracias.
>>>>>>>>>>>>
>>>>>>>>>>>> El lun., 16 dic. 2019 a las 11:14, Lucas Paiva (<
>>>>>>>>>>>> lucaspaiva.ar en gmail.com>) escribió:
>>>>>>>>>>>>
>>>>>>>>>>>>> Como estas? lo que pasa que la cosa esta justamente en la
>>>>>>>>>>>>> función que no estas mostrandonos, si tiene las credentials del cliente
>>>>>>>>>>>>> sacaselas pero mostranos como traes los datos de la api.
>>>>>>>>>>>>> De todas maneras vos decis :
>>>>>>>>>>>>> "cuando se supone que supone que deberìa crear un XML con lo
>>>>>>>>>>>>> que me devuelve la API, lo que esta haciendo es buscar un archivo local con
>>>>>>>>>>>>> ese nombre y me lo muestra en la consola...."
>>>>>>>>>>>>>
>>>>>>>>>>>>> Y la funcion siguiente hace exactamente eso:
>>>>>>>>>>>>>
>>>>>>>>>>>>> ef saveInfo(content, filename):
>>>>>>>>>>>>>     with io.open(filename, 'w', encoding='utf8') as file:
>>>>>>>>>>>>>         file.write(response.text)
>>>>>>>>>>>>>
>>>>>>>>>>>>> Aca estas escribiendo un archivo y luego imprimir el contenido
>>>>>>>>>>>>> por pantalla. y por lo que se entiende del resto del codigo lo estas
>>>>>>>>>>>>> creando con extension .XML
>>>>>>>>>>>>>
>>>>>>>>>>>>> De todas maneras si mal no recuerdo para escribir un archivo
>>>>>>>>>>>>> XML valido, deberias hacer algo como:
>>>>>>>>>>>>> Importar ET de element.etree y hacer algo como :
>>>>>>>>>>>>> my_data = ET.tostring(res_de_api_o_content_xml)
>>>>>>>>>>>>> file = ipen("sarasa.xml","w)
>>>>>>>>>>>>> file.write(my_data)
>>>>>>>>>>>>>
>>>>>>>>>>>>> Sory si no esta todo correcto , lo escribí asi nomas sin
>>>>>>>>>>>>> probar ningún código.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Saludos.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Lucas
>>>>>>>>>>>>>
>>>>>>>>>>>>> El lun., 16 dic. 2019 a las 11:02, Federico Brest (<
>>>>>>>>>>>>> federiconbrest en gmail.com>) escribió:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hola gente,
>>>>>>>>>>>>>> Hic eel siguiente script, pero estoy teniendo
>>>>>>>>>>>>>> problemas...cuando se supone que supone que deberìa crear un XML con lo que
>>>>>>>>>>>>>> me devuelve la API, lo que esta haciendo es buscar un archivo local con ese
>>>>>>>>>>>>>> nombre y me lo muestra en la consola....
>>>>>>>>>>>>>> Algune podrá darme una mano?
>>>>>>>>>>>>>> Envío el código en cuestión:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> def saveInfo(content, filename):
>>>>>>>>>>>>>>     with io.open(filename, 'w', encoding='utf8') as file:
>>>>>>>>>>>>>>         file.write(response.text)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> if __name__ == '__main__':
>>>>>>>>>>>>>>     cuit = input("Ingrese un numero de cuit: ")
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>     print("- Obteniendo información de", cuit)
>>>>>>>>>>>>>>     info = getInfoFromApi(cuit)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> ''' getInfoFromApi es otra funcion que esta declarada en el
>>>>>>>>>>>>>> script. No la transcribo porque estan las key de acceso de lcliente...de
>>>>>>>>>>>>>> todas formas, esa funcion anda '''
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>     cuitValido = validar_cuit(cuit) #esta es otra funcion que
>>>>>>>>>>>>>> esta declarada en el script
>>>>>>>>>>>>>>     if cuitValido == False:
>>>>>>>>>>>>>>         print("El Cuit ",cuit," es Invalido")
>>>>>>>>>>>>>>         print("Presione una tecla para Finalizar...")
>>>>>>>>>>>>>>         msvcrt.getch()
>>>>>>>>>>>>>>     else:
>>>>>>>>>>>>>>         print("cuil válido")
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>     filename = cuit + '.xml'
>>>>>>>>>>>>>>     saveInfo(info, filename)
>>>>>>>>>>>>>>     print("- Guardado en", filename)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Desde ya muchas gracias!!
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> --
>>>>>>>>>>>>>> *          Ing. Federico N. Brest*
>>>>>>>>>>>>>>   Ingeniero en Sistemas de Información
>>>>>>>>>>>>>>             Becario Investigador
>>>>>>>>>>>>>>      Universidad Tecnológica Nacional
>>>>>>>>>>>>>>       Facultad Regional Buenos Aires
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> “*¿El éxito es la meta? Pienso que no. La meta es conseguir,
>>>>>>>>>>>>>> defender y mantener nuestra libertad*” - Richard Stallman
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> *P* *Antes de imprimir este mensaje, piense si realmente es
>>>>>>>>>>>>>> necesario. ¡Cuidemos nuestro Ambiente!*
>>>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>>>> Lista de Correo de PyAr - Python Argentina -
>>>>>>>>>>>>>> pyar en python.org.ar
>>>>>>>>>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>>>>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software
>>>>>>>>>>>>>> Libre de Argentina - http://www.usla.org.ar
>>>>>>>>>>>>>
>>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>>> Lista de Correo de PyAr - Python Argentina -
>>>>>>>>>>>>> pyar en python.org.ar
>>>>>>>>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>>>>>>>>
>>>>>>>>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>>>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>>>>>>>
>>>>>>>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software
>>>>>>>>>>>>> Libre de Argentina - http://www.usla.org.ar
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> *          Ing. Federico N. Brest*
>>>>>>>>>>>>   Ingeniero en Sistemas de Información
>>>>>>>>>>>>             Becario Investigador
>>>>>>>>>>>>      Universidad Tecnológica Nacional
>>>>>>>>>>>>       Facultad Regional Buenos Aires
>>>>>>>>>>>>
>>>>>>>>>>>> “*¿El éxito es la meta? Pienso que no. La meta es conseguir,
>>>>>>>>>>>> defender y mantener nuestra libertad*” - Richard Stallman
>>>>>>>>>>>> *P* *Antes de imprimir este mensaje, piense si realmente es
>>>>>>>>>>>> necesario. ¡Cuidemos nuestro Ambiente!*
>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>>>>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>>>>>>>
>>>>>>>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>>>>>>
>>>>>>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software
>>>>>>>>>>>> Libre de Argentina - http://www.usla.org.ar
>>>>>>>>>>>
>>>>>>>>>>> _______________________________________________
>>>>>>>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>>>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>>>>>>
>>>>>>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>>>>>
>>>>>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software
>>>>>>>>>>> Libre de Argentina - http://www.usla.org.ar
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> *          Ing. Federico N. Brest*
>>>>>>>>>>   Ingeniero en Sistemas de Información
>>>>>>>>>>             Becario Investigador
>>>>>>>>>>      Universidad Tecnológica Nacional
>>>>>>>>>>       Facultad Regional Buenos Aires
>>>>>>>>>>
>>>>>>>>>> “*¿El éxito es la meta? Pienso que no. La meta es conseguir,
>>>>>>>>>> defender y mantener nuestra libertad*” - Richard Stallman
>>>>>>>>>> *P* *Antes de imprimir este mensaje, piense si realmente es
>>>>>>>>>> necesario. ¡Cuidemos nuestro Ambiente!*
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>>>>>
>>>>>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>>>>
>>>>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software
>>>>>>>>>> Libre de Argentina - http://www.usla.org.ar
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>>>>
>>>>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>>>
>>>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software
>>>>>>>>> Libre de Argentina - http://www.usla.org.ar
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> *          Ing. Federico N. Brest*
>>>>>>>>   Ingeniero en Sistemas de Información
>>>>>>>>             Becario Investigador
>>>>>>>>      Universidad Tecnológica Nacional
>>>>>>>>       Facultad Regional Buenos Aires
>>>>>>>>
>>>>>>>> “*¿El éxito es la meta? Pienso que no. La meta es conseguir,
>>>>>>>> defender y mantener nuestra libertad*” - Richard Stallman
>>>>>>>> *P* *Antes de imprimir este mensaje, piense si realmente es
>>>>>>>> necesario. ¡Cuidemos nuestro Ambiente!*
>>>>>>>> _______________________________________________
>>>>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>>>
>>>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>>
>>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre
>>>>>>>> de Argentina - http://www.usla.org.ar
>>>>>>>
>>>>>>> _______________________________________________
>>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>
>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>
>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre
>>>>>> de Argentina - http://www.usla.org.ar
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *          Ing. Federico N. Brest*
>>>>>   Ingeniero en Sistemas de Información
>>>>>             Becario Investigador
>>>>>      Universidad Tecnológica Nacional
>>>>>       Facultad Regional Buenos Aires
>>>>>
>>>>> “*¿El éxito es la meta? Pienso que no. La meta es conseguir, defender
>>>>> y mantener nuestra libertad*” - Richard Stallman
>>>>> *P* *Antes de imprimir este mensaje, piense si realmente es
>>>>> necesario. ¡Cuidemos nuestro Ambiente!*
>>>>> _______________________________________________
>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>> Sitio web: http://www.python.org.ar/
>>>>>
>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>
>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>>>> Argentina - http://www.usla.org.ar
>>>>
>>>> _______________________________________________
>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>> Sitio web: http://www.python.org.ar/
>>>>
>>>> Para administrar la lista (o desuscribirse) entrar a
>>>> http://listas.python.org.ar/listinfo/pyar
>>>>
>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>>> Argentina - http://www.usla.org.ar
>>>
>>>
>>>
>>> --
>>> *          Ing. Federico N. Brest*
>>>   Ingeniero en Sistemas de Información
>>>             Becario Investigador
>>>      Universidad Tecnológica Nacional
>>>       Facultad Regional Buenos Aires
>>>
>>> “*¿El éxito es la meta? Pienso que no. La meta es conseguir, defender y
>>> mantener nuestra libertad*” - Richard Stallman
>>> *P* *Antes de imprimir este mensaje, piense si realmente es necesario.
>>> ¡Cuidemos nuestro Ambiente!*
>>> _______________________________________________
>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>> Sitio web: http://www.python.org.ar/
>>>
>>> Para administrar la lista (o desuscribirse) entrar a
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>> Argentina - http://www.usla.org.ar
>>
>> _______________________________________________
>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> Sitio web: http://www.python.org.ar/
>>
>> Para administrar la lista (o desuscribirse) entrar a
>> http://listas.python.org.ar/listinfo/pyar
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>
>
>
> --
> *          Ing. Federico N. Brest*
>   Ingeniero en Sistemas de Información
>             Becario Investigador
>      Universidad Tecnológica Nacional
>       Facultad Regional Buenos Aires
>
> “*¿El éxito es la meta? Pienso que no. La meta es conseguir, defender y
> mantener nuestra libertad*” - Richard Stallman
> *P* *Antes de imprimir este mensaje, piense si realmente es necesario.
> ¡Cuidemos nuestro Ambiente!*
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a
> http://listas.python.org.ar/listinfo/pyar
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20191218/0c0b8ce6/attachment-0001.html>


Más información sobre la lista de distribución pyar