xlabel - InteractĂșa con otros programas usando Python
matplotlib xticks (5)
Aquí hay una implementación en Python del comentario de @Matteo Italia :
Se está abordando el problema desde una "perspectiva del usuario" cuando debería abordarlo desde una "perspectiva de programador"; no necesita abrir un navegador, copiar el texto, abrir Word o lo que sea, necesita realizar las solicitudes HTTP apropiadas, analizar el HTML relevante, extraer el texto y escribirlo en un archivo desde su script de Python. Todas las herramientas para hacer esto están disponibles en Python (en particular, necesitarás urllib2 y BeautifulSoup).
#!/usr/bin/env python
import codecs
import json
import sys
import urllib
import urllib2
import bs4 # pip install beautifulsoup4
def extract_lyrics(page):
"""Extract lyrics text from given lyrics.wikia.com html page."""
soup = bs4.BeautifulSoup(page)
result = []
for tag in soup.find(''div'', ''lyricbox''):
if isinstance(tag, bs4.NavigableString):
if not isinstance(tag, bs4.element.Comment):
result.append(tag)
elif tag.name == ''br'':
result.append(''/n'')
return "".join(result)
# get artist, song to search
artist = raw_input("Enter artist:")
song = raw_input("Enter song:")
# make request
query = urllib.urlencode(dict(artist=artist, song=song, fmt="realjson"))
response = urllib2.urlopen("http://lyrics.wikia.com/api.php?" + query)
data = json.load(response)
if data[''lyrics''] != ''Not found'':
# print short lyrics
print(data[''lyrics''])
# get full lyrics
lyrics = extract_lyrics(urllib2.urlopen(data[''url'']))
# save to file
filename = "[%s] [%s] lyrics.txt" % (data[''artist''], data[''song''])
with codecs.open(filename, ''w'', encoding=''utf-8'') as output_file:
output_file.write(lyrics)
print("written ''%s''" % filename)
else:
sys.exit(''not found'')
Ejemplo
$ printf "Queen/nWe are the Champions" | python get-lyrics.py
Salida
I''ve paid my dues Time after time I''ve done my sentence But committed no crime And bad mistakes I''ve made a few I''ve had my share of sand kicked [...] written ''[Queen] [We are the Champions] lyrics.txt''
Tengo la idea de escribir un programa usando Python, que encontrará una letra de una canción cuyo nombre proporcioné. Creo que todo el proceso debería reducirse a un par de cosas a continuación. Esto es lo que quiero que haga el programa cuando lo ejecute:
- me pide que ingrese el nombre de una canción
- copia ese nombre
- abrir un navegador web (google chrome por ejemplo)
- pega ese nombre en la barra de direcciones y encuentra información sobre la canción
- Abre una página que contiene las letras.
- copia esa letra
- ejecutar un editor de texto (como Microsoft Word, por ejemplo)
- pegar las letras
- Guarda el nuevo archivo de texto con el nombre de la canción.
No estoy pidiendo código, por supuesto. Solo quiero saber los conceptos o ideas sobre cómo usar Python para interactuar con otros programas
Para ser más específicos, creo que quiero saber, por ejemplo, cómo nos indicamos dónde está la barra de direcciones en Google Chrome y le pedimos a Python que pegue el nombre allí. O cómo le decimos a Python cómo copiar las letras y cómo pegarlas en la hoja de Microsof Word y luego guardarlas.
He estado leyendo (sigo leyendo) varios libros en Python: Byte of Python, Learn python the hard way, Python para dummies, Beginning Game Development with Python and Pygame. Sin embargo, descubrí que parece que solo (o casi solo) aprendí a crear programas que funcionan en sí mismos (no puedo decirle a mi programa que haga las cosas que quiero con otros programas que ya están instalados en mi computadora)
Sé que mi pregunta de alguna manera suena bastante tonta, pero realmente quiero saber cómo funciona, la forma en que le decimos a Python que se dé cuenta de que esta parte del navegador Google Chrome es la barra de direcciones y que debería pegar el nombre de la canción. eso. La idea de hacer que Python interactúe con otro programa es realmente vaga para mí y simplemente quiero comprender eso.
Gracias a todos, quienquiera que dedique su tiempo a leer mi pregunta tan larga.
ttriet204
Debería buscar en un paquete llamado selenium
para interactuar con navegadores web
La siguiente secuencia de comandos usa Automa para hacer exactamente lo que quiere (probado en Word 2010):
def find_lyrics():
print ''Please minimize all other open windows, then enter the song:''
song = raw_input()
start("Google Chrome")
# Disable Google''s autocompletion and set the language to English:
google_address = ''google.com/webhp?complete=0&hl=en''
write(google_address, into="Address")
press(ENTER)
write(song + '' lyrics filetype:txt'')
click("I''m Feeling Lucky")
press(CTRL + ''a'', CTRL + ''c'')
press(ALT + F4)
start("Microsoft Word")
press(CTRL + ''v'')
press(CTRL + ''s'')
click("Desktop")
write(song + '' lyrics'', into="File name")
click("Save")
press(ALT + F4)
print("/nThe lyrics have been saved in file ''%s lyrics'' "
"on your desktop." % song)
Para probarlo por ti mismo, descarga Automa.zip desde su página de descarga y descomprime en, digamos, c:/Program Files
. Obtendrá una carpeta llamada Automa 1.1.2
. Ejecute Automa.exe
en esa carpeta. Copie el código de arriba y péguelo en Automa haciendo clic derecho en la ventana de la consola. Presione Enter dos veces para deshacerse de la última ...
en la ventana y volver a la línea de comandos >>>
. Cierre todas las demás ventanas abiertas y escriba
>>> find_lyrics()
Esto realiza los pasos requeridos.
Automa es una biblioteca de Python : para usarla como tal, debe agregar la línea
from automa.api import *
en la parte superior de sus scripts y el archivo library.zip
del directorio de instalación de Automa a su variable de entorno PYTHONPATH
.
Si tiene alguna otra pregunta, hágamelo saber :-)
Si lo que realmente estás buscando es una buena excusa para enseñarte a ti mismo cómo interactuar con otras aplicaciones, puede que esta no sea la mejor. Los navegadores web son confusos, el tiempo será impredecible, etc. Entonces, asumió una tarea muy difícil, y sería muy fácil si lo hiciera de la manera habitual (hable directamente con el servidor, cree el archivo de texto directamente, etc., todo sin tocar ningún otro programa).
Pero si desea interactuar con otras aplicaciones, hay una variedad de enfoques diferentes, y el que es apropiado depende de los tipos de aplicaciones con las que deba lidiar.
Algunas aplicaciones están diseñadas para ser automatizadas desde el exterior. En Windows, esto casi siempre significa que son una interfaz COM, generalmente con una interfaz IDispatch, para la cual puede usar las envolturas COM de
pywin32
; en Mac, significa una interfaz AppleEvent, para la que utilizaScriptingBridge
oappscript
; En otras plataformas no existe un estándar universal. IE (pero probablemente no Chrome) y Word tienen interfaces de este tipo.Algunas aplicaciones tienen una interfaz que no es GUI, ya sea una línea de comandos que puede manejar con
popen
, o una DLL / SO / DYLIB que puede cargar a través dectypes
. O, idealmente, alguien más ya ha escrito enlaces de Python para ti.Algunas aplicaciones no tienen más que la GUI, y no hay forma de hacer la automatización de la GUI. Puede hacerlo en un nivel bajo, creando mensajes WM_ para enviarlos a través de
pywin32
en Windows, utilizando las API de accesibilidad en Mac, etc., o en un nivel algo más alto con bibliotecas comopywinauto
, o posiblemente en un nivel muy alto deselenium
o herramientas similares creadas para automatizar aplicaciones específicas.
Por lo tanto, puede hacer esto con cualquier cosa, desde selenio para Chrome y COM automatización para Word, hasta la elaboración de todos los mensajes WM_. Si se pretende que sea un ejercicio de aprendizaje, la pregunta es cuál de esas cosas quiere aprender hoy.
Vamos a empezar con la automatización COM. Usando pywin32
, puede acceder directamente a las propias interfaces de scripting de la aplicación, sin tener que tomar el control de la GUI del usuario, averiguar cómo navegar por los menús y los cuadros de diálogo, etc. Esta es la versión moderna de escribir "macros de palabras": las macros pueden ser scripts externos en lugar de dentro de Word, y no tienen que estar escritos en VB, pero se ven bastante similares. La última parte de su script se vería así:
word = win32com.client.dispatch(''Word.Application'')
word.Visible = True
doc = word.Documents.Add()
doc.Selection.TypeText(my_string)
doc.SaveAs(r''C:/TestFiles/TestDoc.doc'')
Si te fijas en Microsoft Word Scripts , puedes ver un montón de ejemplos. Sin embargo, puede notar que están escritos en VBScript. Y si buscas tutoriales, todos están escritos para VBScript (o VB anterior). Y la documentación para la mayoría de las aplicaciones está escrita para VBScript (o VB, .NET o incluso COM de bajo nivel). Y todos los tutoriales que conozco sobre el uso de la automatización COM de Python, como Quick Start to Client Side COM y Python , están escritos para personas que ya conocen la automatización COM, y solo quieren saber cómo hacerlo desde Python. El hecho de que Microsoft siga cambiando el nombre de todo lo hace aún más difícil de buscar. ¿Cómo adivinarías que buscar en Google para la automatización OLE, las secuencias de comandos ActiveX, Windows Scripting House, etc. tendría algo que ver con aprender sobre la automatización COM? Entonces, no estoy seguro de qué recomendar para comenzar. Puedo prometer que todo es tan simple como se ve en el ejemplo anterior, una vez que aprendas todas las tonterías, pero no sé cómo superar ese obstáculo inicial.
De todos modos, no todas las aplicaciones son automatizables. Y a veces, incluso si lo es, describir las acciones de la GUI (lo que un usuario haría clic en la pantalla) es más simple que pensar en términos del modelo de objetos de la aplicación. "Seleccione el tercer párrafo" es difícil de describir en términos de GUI, pero "seleccionar todo el documento" es fácil: simplemente presione control-A, o vaya al menú Editar y Seleccionar todo. La automatización de la GUI es mucho más difícil que la automatización COM, ya que tiene que enviar a la aplicación los mismos mensajes que el propio Windows envía para representar las acciones de los usuarios (p. Ej., Consulte " Notificaciones de menú ") o, peor aún, cree mensajes de ratón como "ir (32 , 4) píxeles de la esquina superior izquierda, haga clic, baje el mouse hacia abajo a 16 píxeles, haga clic nuevamente "para decir", abra el menú Archivo, luego haga clic en Nuevo ".
Afortunadamente, hay herramientas como code.google.com/p/pywinauto que envuelven ambos tipos de cosas de automatización GUI para hacerlo mucho más simple. Y hay herramientas como swapy
que pueden ayudarte a descubrir qué comandos quieres enviar. Si no estás casado con Python, también hay herramientas como AutoIt
y Actions
que son incluso más fáciles que usar swapy
y pywinauto
, al menos cuando estás empezando. Yendo de esta manera, la última parte de su script podría ser:
word.Activate()
word.MenuSelect(''File->New'')
word.KeyStrokes(my_string)
word.MenuSelect(''File->Save As'')
word.Dialogs[-1].FindTextField(''Filename'').Select()
word.KeyStrokes(r''C:/TestFiles/TestDoc.doc'')
word.Dialogs[-1].FindButton(''OK'').Click()
Finalmente, incluso con todas estas herramientas, los navegadores web son muy difíciles de automatizar, ya que cada página web tiene sus propios menús, botones, etc. que no son controles de Windows sino HTML. A menos que quiera bajar hasta el nivel de "mover el mouse 12 píxeles", es muy difícil lidiar con estos. Ahí es donde entra en pywinauto
scripts en las GUI web de la misma manera que pywinauto
scripts en las GUI de Windows.
Si realmente desea abrir un navegador, etc., busque selenium . Pero eso es una exageración para sus propósitos. Selenium se usa para simular clics de botones, etc. para probar el aspecto de los sitios web en varios navegadores, etc. Mechanize es una exageración menor para esto
Lo que realmente quieres hacer es entender cómo funciona un navegador (o cualquier otro programa) debajo del capó, es decir, cuando haces clic con el mouse, escribes en el teclado o presionas Save
, ¿qué hace el programa detrás de escena? Es este trabajo detrás de escena lo que quiere que haga su código de Python.
Por lo tanto, use urllib
, urllib2
o requests
(o diablos, incluso scrapy
) para solicitar una página web (aprenda cómo armar la url para una búsqueda de Google o la solicitud php GET
de un sitio web de letras). Google también tiene una API de búsqueda que puede aprovechar para realizar una búsqueda en Google.
Una vez que tenga los resultados de su solicitud de página, lxlml
con xml
, beautifulsoup
, lxlml
, etc. y busque la sección del resultado de la solicitud que contiene la información que busca.
Ahora que tiene sus letras, lo más simple que puede hacer es abrir un archivo de texto y volcar las letras allí y escribirlas en el disco. Pero si realmente quieres hacerlo con MS Word, abre un archivo doc
en notepad o notepad ++ y observa su estructura. Ahora, usa python para construir un documento con una estructura similar, en donde el contenido será la letra descargada.
Si este método falla, puede buscar en pywinauto u otro para automatizar el pegado de texto en un documento de MS Word y hacer clic en Save
Cita: Matteo Italia, gddc de los comentarios sobre el OP