[pyar] xml.etree.ElementTree

Federico Brest federiconbrest en gmail.com
Mie Dic 18 15:15:38 -03 2019


No uso response.text finalmente, esta comentada esa linea

El mié., 18 dic. 2019 a las 15:03, Augusto (<adtononi en gmail.com>) escribió:

> 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
>
> _______________________________________________
> 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!*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20191218/bffa8f98/attachment-0001.html>


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