如何将所有twill命令汇总到一个.py文件中?

1 投票
4 回答
3202 浏览
提问于 2025-04-15 21:54

我刚开始接触TWILL

Twill 是一种很棒的网页浏览脚本语言,能满足我所有的需求!

到目前为止,我一直在 Python 的命令行界面(具体来说是IDLE (Python GUI))中使用 twill,我的操作方式是一个一个地执行命令(也就是说,我输入一个命令,运行它,然后再输入下一个命令):alt text
(来源: narod.ru)

alt text
(来源: narod.ru)

alt text
(来源: narod.ru)

alt text
(来源: narod.ru)

alt text
(来源: narod.ru)

alt text
(来源: narod.ru)

alt text
(来源: narod.ru)

但是我不知道怎么把这些命令放在一个 .py 文件里,这样它们就可以自动一个接一个地执行。

看起来在 twill 中是有这种可能性的。这个来自 twill 文档页面的例子(你可以在这里看到)展示了一段包含多个命令的代码:alt text
(来源: narod.ru)

所以,我的问题是:我该如何把所有命令放在一起使用 twill?


更新 1:

(这个更新是我对 S.Mark 的回复)

你好,S.Mark!很抱歉回复得晚了。首先,关于我电脑上 twill 和 python 相关文件夹的位置的一些信息:

我电脑上 Python2.5 的安装路径是:C:\Python25

我电脑上 twill-0.9 的路径是:E:\tmp\twill-0.9

假设我想让以下命令自动执行:

go http://www.yahoo.com

save_html result.html

这段代码应该会查看 yahoo 页面,然后把它的 HTML 代码保存到 result.html 文件里。

所以,按照你的指示,我首先创建了一个包含这段只有两行代码的“test.txt”文件,并把它保存为“test.twill”在 twill-0.9 文件夹中,这样这个文件的完整路径就是 E:\tmp\twill-0.9\test.twill

然后我尝试以多种不同方式将文件名作为参数传递给 twill-sh 命令,但都没有成功(我一定是做错了什么):alt text
(来源: narod.ru)

alt text
(来源: narod.ru)

但是你知道吗,我决定稍微实验一下,创建了一个 test.py 文件,里面也只包含那两条命令。这个文件我也放在 twill-0.9 文件夹中(E:\tmp\twill-0.9\test.py),然后我决定尝试从 twill shell 使用 twill 的 runfile 命令来运行它,结果出乎意料地成功了!:alt text
(来源: narod.ru)

运行后,我查看了我的 C:\Python25 文件夹,发现那里的 result.html 文件是新创建的!

好吧,我在这里做的就是从 twill shell 运行一个文件,使用了一个 twill 命令。虽然目前这正是我需要的,但其他支持者(如你在下面看到的)建议我应该从 python shell 而不是 twill shell 来做所有事情,而这正是我仍然不知道怎么做的。

我接下来的步骤是尝试在“Google App Engine”上运行类似的代码,但据我所知,那里只识别 Python,而不识别 twill,这意味着如果我只知道如何用 twill 来做事情,而不知道用 python 来做,我就无法让“Google App Engine”执行我的命令。


更新 2:

(2010年4月23日,星期五,3:48:15 a.m.(GMT+0.00))

(这个更新是我对 S.Mark 的第二次回复)

看起来从命令提示符运行也不成功:

alt text
(来源: narod.ru)

4 个回答

2

我觉得与其使用twill的命令行工具,不如直接通过twill的Python接口来调用函数。你可以在这里找到相关的文档:http://twill.idyll.org/python-api.html

3

下面是它的实际应用(稍微改动了一下):

>>> import twill.commands
>>> import BeautifulSoup
>>> 
>>> class browser:
...    def __init__(self, url="http://www.google.com",log = None):
...       self.a=twill.commands
...       self.a.config("readonly_controls_writeable", 1)
...       self.b = self.a.get_browser()
...       self.b.set_agent_string("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14")
...       self.log = log
...       self.b.clear_cookies()
...       self.url=url
...    def googleQuery(self, query="python code"):
...       self.b.go(self.url)
...       #self.b.showforms()
...       f = self.b.get_form("f")
...       #print "form is %s" % f
...       f["q"] = query
...       self.b.clicked(f, "btnG")
...       self.b.submit()
...       pageContent = self.b.get_html()
...       soup=BeautifulSoup.BeautifulSoup(pageContent)
...       ths = soup.findAll(attrs={"class" : "l"})
...       for a in ths:
...          print a
... 
>>> t=browser()
>>> t.googleQuery("twill queries")
==> at http://www.google.ie/
Note: submit is using submit button: name="btnG", value="Google Search"

<a href="http://pyparsing.wikispaces.com/WhosUsingPyparsing" class="l" onmousedown="return clk(this.href,'','','res','1','','0CBMQFjAA')">pyparsing - WhosUsingPyparsing</a>
<a href="http://www.mail-archive.com/twill@lists.idyll.org/msg00048.html" class="l" onmousedown="return clk(this.href,'','','res','2','','0CBcQFjAB')">Re: [<em>twill</em>] <em>query</em>: docs, and web site.</a>
<a href="http://www.mail-archive.com/twill@lists.idyll.org/msg00050.html" class="l" onmousedown="return clk(this.href,'','','res','3','','0CBkQFjAC')">Re: [<em>twill</em>] <em>query</em>: docs, and web site.</a>
<a href="http://www.genealogytoday.com/surname/finder.mv?Surname=Twill" class="l" onmousedown="return clk(this.href,'','','res','4','','0CB4QFjAD')"><em>Twill</em> Genealogy and Family Tree Resources - Surname Finder</a>
<a href="http://a706cheap-apparel.hobby-site.com/ladies-cotton-faded-twill-le-chameau-breeks-42" class="l" onmousedown="return clk(this.href,'','','res','5','','0CCEQFjAE')">Ladies Cotton Faded <em>Twill</em> Le Chameau Breeks 42</a>
<a href="http://twill.idyll.org/examples.html" class="l" onmousedown="return clk(this.href,'','','res','6','','0CCMQFjAF')"><em>twill</em> Examples</a>
<a href="http://panjiva.com/Sri-Lankan-Manufacturers-Of/twill+capri" class="l" onmousedown="return clk(this.href,'','','res','7','','0CCcQFjAG')">Sri-Lankan <em>Twill</em> Capri Manufacturers | Sri-Lankan Suppliers of <b>...</b></a>
<a href="http://c586cheap-apparel.dyndns.ws/twill-beige-blazer" class="l" onmousedown="return clk(this.href,'','','res','8','','0CCoQFjAH')"><em>Twill</em> beige blazer</a>
<a href="http://stackoverflow.com/questions/2267537/how-do-you-use-relative-paths-for-twill-tests" class="l" onmousedown="return clk(this.href,'','','res','9','','0CCwQFjAI')">How do you use Relative Paths for <em>Twill</em> tests? - Stack Overflow</a>
<a href="http://mytextilenotes.blogspot.com/2010/01/introduction-to-twill-weave.html" class="l" onmousedown="return clk(this.href,'','','res','10','','0CC8QFjAJ')">My Textile Notes: Introduction to <em>Twill</em> Weave</a>
>>>  

我使用的是ubuntu系统,所以我用以下命令来安装BeautifulSoup和twill:

sudo apt-get install BeautifulSoup*  
sudo apt-get install python-twill*

这有什么用呢

A

3

把你的twill命令放到一个文件里,比如叫做 test.twill

setlocal query "twill Python"

go http://google.com/

fv 1 q $query
submit btnI     # use the "I'm feeling lucky" button

show

然后只需要把这个文件名作为参数传给twill-sh命令,就像这样

python twill-sh test.twill

你可能还想查看一下twill源代码中的 tests 文件夹里的.twill示例代码

test-back.twill
test-basic.twill
test-dns.twill
test-equiv-refresh.twill
test-find.twill
test-form.twill
test-formfill.twill
test-global-form.twill
test-go-exit.twill
....

撰写回答