使用Python与其他程序交互
我有一个想法,就是用Python编写一个程序,找到一首歌的歌词,我提供了这首歌的名字。我认为整个过程应该归结为以下几点。以下是我希望程序在运行时执行的操作:使用Python与其他程序交互,python,automation,interop,concept,Python,Automation,Interop,Concept,我有一个想法,就是用Python编写一个程序,找到一首歌的歌词,我提供了这首歌的名字。我认为整个过程应该归结为以下几点。以下是我希望程序在运行时执行的操作: 提示我输入歌曲的名称 复制那个名字 打开web浏览器(例如google chrome) 将该名称粘贴到地址栏并查找有关歌曲的信息 打开包含歌词的页面 抄写歌词 运行文本编辑器(例如Microsoft Word) 粘贴歌词 用歌曲名称保存新文本文件 当然,我不是要代码。我只是想知道关于如何使用python与其他程序交互的概念或想法 更具体
- 提示我输入歌曲的名称
- 复制那个名字
- 打开web浏览器(例如google chrome)
- 将该名称粘贴到地址栏并查找有关歌曲的信息
- 打开包含歌词的页面
- 抄写歌词
- 运行文本编辑器(例如Microsoft Word)
- 粘贴歌词
- 用歌曲名称保存新文本文件
ttriet204您应该查看一个名为
selenium
的包,用于与web浏览器进行交互如果您确实想打开浏览器等,请查看。但这对你来说太过分了。Selenium用于模拟按钮点击等,用于测试各种浏览器上的网站外观等。对于这一点,Selenium不太过分
您真正想做的是了解浏览器(或任何其他程序)在引擎盖下是如何工作的,即当您单击鼠标或键入键盘或点击保存时,该程序在幕后做什么?这就是您希望python代码完成的幕后工作
因此,使用urllib
、urllib2
或(甚至是heck)请求一个网页(学习如何将url组合到谷歌搜索或phpGET
歌词网站请求)。谷歌也有一个你可以利用的搜索引擎,来执行谷歌搜索
获得页面请求的结果后,使用xml
、beautifulsoup
、lxlml
等对其进行解析,并找到请求结果中包含您所需信息的部分
现在你有了歌词,最简单的事情就是打开一个文本文件,把歌词转储到里面,然后写到磁盘上。但是如果你真的想用MS Word来做,那么在记事本或记事本++中打开一个doc
文件,看看它的结构。现在,使用python构建一个具有类似结构的文档,其中的内容将是下载的歌词。
如果此方法失败,您可以研究或类似方法,自动将文本粘贴到MS Word文档中,然后单击Save
引文:Matteo Italia,g.d.d.c.来自OP上的评论如果你真正想要的是一个很好的借口来教自己如何与其他应用程序交互,那么这可能不是最好的借口。Web浏览器杂乱无章,时间不可预测,等等。因此,您承担了一项非常艰巨的任务,如果您按照通常的方式(直接与服务器对话,直接创建文本文件,等等,所有这些都不涉及任何其他程序),这项任务将非常简单
但是,如果你真的想与其他应用程序交互,有多种不同的方法,哪种方法合适取决于你需要处理的应用程序的类型
- 有些应用程序设计为从外部自动运行。在Windows上,这几乎总是意味着它们是一个COM接口,通常带有IDispatch接口,您可以使用
pywin32
的COM包装器;在Mac上,它意味着一个AppleEvent接口,您可以使用ScriptingBridge
或appscript
;在其他平台上,没有通用标准。IE(但可能不是Chrome)和Word都有这样的接口
- 有些应用程序有一个非GUI界面,无论是可以使用
popen
驱动的命令行,还是可以通过ctypes
加载的DLL/SO/DYLIB。或者,理想情况下,其他人已经为您编写了Python绑定
- 有些应用程序除了GUI之外什么都没有,而且无法实现GUI自动化。您可以在较低的级别上完成此操作,方法是在Windows上通过
pywin32
发送WM_uu消息,在Mac上使用辅助功能API等,或者在较高的级别上使用库,如pywinauto
,或者可能在非常高的级别上使用selenium
或为自动化特定应用而构建的类似工具
所以,你可以用任何东西来实现这一点,从selenium for Chrome和COM automation for Word,到自己制作所有WM_uu消息。如果这是一个学习练习,问题是你今天想学习哪些东西
让我们从COM自动化开始。使用,您可以直接访问应用程序自己的脚本界面,而不必从用户手中控制GUI,了解如何导航菜单和对话框等
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')
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()
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)
>>> find_lyrics()
from automa.api import *
#!/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')
$ printf "Queen\nWe are the Champions" | python get-lyrics.py
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'