[pyar] xml.etree.ElementTree

Augusto adtononi en gmail.com
Lun Dic 16 16:18:04 -03 2019


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


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