[pyar] xml.etree.ElementTree

Federico Brest federiconbrest en gmail.com
Mie Dic 18 12:08:25 -03 2019


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


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