twill言語リファレンス

twill について
=============

[twill] (http://twill.idyll.org) は、Webサイトをクロールするためのツールです。Pythonで書かれています。twill-shというコマンドラインインターフェースがあります。 またPythonスクリプトから操作するためのAPIが用意されています。


この邦訳について
===============

twill言語リファレンスの節は http://twill.idyll.org にある

-   [Language reference](<http://twill.idyll.org/commands.html>) -- the twill scripting language.

を独自に邦訳したものです。原著が含まれる twill の著作権は以下の通りです。この邦訳は、原著と同じく[MIT license](<http://www.opensource.org/licenses/mit-license.php>) の下に公開するものとします。

#### [Authors and License](<https://www.blogger.com/null>)

The main author of twill is C. Titus Brown, titus@idyll.org. A number of people have contributed bug reports and code since the first release; they are acknowledged below.

The twill source code is Copyright (C) 2005, 2006, 2007 C. Titus Brown. twill is available under the [MIT license](<http://www.opensource.org/licenses/mit-license.php>).

[pyparsing](<http://pyparsing.sourceforge.net/>), [mechanize](<http://wwwsearch.sf.net/>), and [BeautifulSoup](<http://www.crummy.com/software/BeautifulSoup/>) are included with twill for convenience, but are under their own licenses.

twill言語リファレンス
=====================

ここに出てくるコマンドはtwillの組み込みコマンドです。'＃' 以降のすべてのテキストは、コメントとして無視されます。ただし、'＃'が引用符で囲まれた文字列中に現れる場合はコメントにはなりません。

### ブラウジング

**go** *\<url\>* -- 指定の URL を訪れます。Pythonの関数は、リダイレクトをすべてたどり、最後の訪問したURLを返します。

**back** -- 以前のURLに戻ります。Pythonの関数は、もしURLがあればそのURLを返します。

**reload** -- 現在のURLをリロードします。Pythonの関数は、もしURLがあればそのURLを返します。

**follow** *\<link name\>* -- 指定されたリンクをたどります。Pythonの関数は、リダイレクトをすべてたどり、最後の訪問したURLを返します。

### アサーション

**code** *\<code\>* -- 最後にロードされたページが、このHTTPステータスであることを確認します。例えばcode 200が成立すれば、ページがただしくロードされていることになります。

**find** *\<regexp\>* -- ページに、この正規表現が含まれていることを確認します. 変数 `__match__` は、最初に一致したサブグループに設定されます。（サブグループが指定されていない場合、マッチした文字列全体です。）Pythonから呼び出されたときは、マッチした文字列が返されます。

**notfind** *\<regexp\>* -- ページにこの正規表現が含まれていないことを確認します。

**url** *\<regexp\>* -- 現在のURLが与えられた正規表現にマッチすることを確認します。 変数 `__match__` は、最初に一致したサブグループに設定されます。（サブグループが指定されていない場合、マッチした文字列全体です。）Pythonから呼び出された場合、マッチした文字列が返されます。

**title** *\<regexp\>* -- このページのタイトルがこの正規表現にマッチすることを確認します。変数 `__match__` は、最初に一致したサブグループに設定されます。（サブグループが指定されていない場合、マッチした文字列全体です。）Pythonから呼び出された場合、マッチした文字列が返されます。

### 表示

**echo** *\<string\>* -- 文字列を画面に表示します。

**info** -- 現在のページに関する情報を表示します。

**redirect_output** *\<filename\>* -- 指定したファイルにtwillからのすべての出力を追加します。

**reset_output** -- 出力を画面に表示します。

**save_html** *[\<filename\>]* -- 現在のページのHTMLをファイルに保存します。ファイル名が指定されていない場合、URLからファイル名が決められます。

**show** -- 現在のページのHTMLを表示します。 Pythonから呼び出された場合、この関数は、HTMLを含む文字列を返します。

**showlinks** -- 現在のページのすべてのリンクを表示します。Pythonから呼び出された場合、この関数を使用すると、リンクオブジェクトのリストを返します。

**showforms** -- 現在のページのすべてのフォームを表示します。Pythonから呼び出された場合、この関数は、フォームのリストを返します。

**showhistory** -- ブラウザの履歴を表示します。Pythonから呼び出された場合、この関数は、履歴を返します。

### フォーム

**submit** *[\<n\>]* -- n番目の送信ボタンをクリックします。指定がない場合は最後にクリックした送信ボタンを使用します。なにもクリックしていないときは、フォームの最初の送信ボタンを使用します。詳しくは参照フォーム処理の詳細を参照。

**formvalue** *\<formnum\> \<fieldname\> \<value\>* -- 指定のフォームのフィールドに値を設定します。読み取り専用のフォームウィジェット/コントロールを操作したときは、値は変更されませんが、**submit**するときのために記憶されることがあります。'config'コマンドで、デフォルトの動作を変更することができます。詳しくは、'config'とフォーム処理の詳細の'formvalue'コマンドを参照してください。

リストウィジェットでは、 'formvalue \<formnum\> \<fieldname\> +値'、または 'formvalue \<formnum\> \<fieldname\> -値' で、値の選択を、設定あるいは解除することができます。

**fv** -- 'formvalue "の略称。

**formaction** *\<formnum\> \<action\>* -- フォームアクションURLを指定されたURLに変更します。

**fa** -- 'formaction'の略。

訳注) 原典では **fa** -- abbreviation for 'fa'. となっています。

**formclear** -- フォーム内のすべての値をクリアします。

**formfile** *\<formspec\> \<fieldspec\> \<filename\> [ \<content_type\> ]* -- アップロード対象のファイルを指定します。

### クッキー

**save_cookies** *\<filename\>* -- 現在のクッキーをファイルに保存します。

**load_cookies** *\<filename\>* -- ファイルからクッキーをロードします。

**clear_cookies** -- 現在のすべてのクッキーをクリアにします。

**show_cookies** -- 現在のクッキーを表示します。

### デバッグ

**debug** *\<what\> \<level\>* -デバッグ/のトレースをオンまたはオフにする。 最初の引数は、'http'、'equiv-refresh'、'commands' のいずれかです。'http'ではHTTPヘッダーの表示、'equiv-refresh' はHTTP EQUIV-REFRESHヘッダをテストするか、'commands'は twill コマンドの表示を変更します。二番目の引数は、'0'がオフ、'1'がオンです。 変数の扱い

**setglobal** *\<name\> \<value\>* -- 変数\<name\>を値\<value\>でグローバル辞書にセットします。値は '$name'で参照することができます。

訳注) 値の参照は原典では The value can be retrieved with '\$value'. となっていますがおそらく $name でしょう。

**setlocal** *\<name\> \<value\>* -- 変数\<name\>を値\<value\>でローカル辞書にセットします。値は '$name'で参照することができます。

訳注) 値の参照は原典では The value can be retrieved with '\$value'. となっていますがおそらく $name でしょう。

ローカル辞書はファイル固別のものですが、グローバル辞書はモジュール全体ですべてのコマンドに使用されます。ローカル変数は、グローバル変数を上書きします。

文字列中で${var}のように変数を使用することができます。例えば

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
setglobal a 1
setglobal b 2

fv thisform thatfield "${a}${b}"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

### その他のコマンド

**tidy_ok** -- このページを'tidy'コマンドで処理して、エラーや警告がなかったことを確認します。 （ tidyはかなり厳密なので、おそらく警告がでるでしょう!）

**exit** *[\<code\>]* -- 指定された整数コードで終了したかどうかチェックします。'code' の指定がない場合はデフォルト値 0 でチェックします。

**run** *\<command\>* -- 指定されたPythonのコマンドを実行します。

**runfile** *\<file1\> [\<file2\>... ]* -- 指定されたファイルを実行します。

**agent** -- ブラウザの"User-agent"文字列を設定します。

**sleep** *[\<seconds\>]* -指定された秒数だけスリープします。デフォルトは1秒。

**reset_browser** -- ブラウザをリセットします。

**extend_with** *\<module\>* -- Pythonモジュールからコマンドをimportします。これはPythonでの `from <module> import *` のように動作します。`extmodule`の関数`fn`が、コマンド`fn`として使用できるようになります。examples/extend_example.py参照してください。

**getinput** *\<prompt\>* -- キーボード入力を取得し`__ input__`に保存します。Pythonから呼び出された場合、この関数は入力値を返します。

**getPassword** *\<prompt\>* -- エコーなしでキーボード入力を取得し`__password__`に保存します。Pythonから呼び出された場合、この関数は入力値を返します。

**add_auth** *\<realm\> \<uri\> \<user\> \<password\>* -- 指定されたrealm/uri の組に対する、HTTP基本認証情報を追加します。

例:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
add_auth IdyllStuff http://www.idyll.org/ titus test
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

`http://www.idyll.org/`でレルム"IdyllStuff" からの認証要求に、ユーザ名 "titus"、パスワード "test"を返すようにします。'with_default_realm' オプションがTrueに設定されている場合、 'realm' を無視します。

**config** *[\<key\> [\<value\>]]* -- オプションの表示または設定をします。

**add_extra_headers** *\<name\> \<value\>* -- HTTPリクエストに追加するHTTPヘッダーを指定します。

**show_extra_headers** -- HTTPリクエストに追加するヘッダを表示します。

**clear_extra_headers** -- add_extra_headers で指定した追加ヘッダーをクリアします。

### 特殊な変数

`__input__` -- 最後に実行したgetinputの結果。

`__match__` -- 最後に実行したfind 、title 、URLでマッチしたテキスト。

`__password__` -- 最後に実行したgetPasswordの値。

`__url__` -- 現在のURL。

### フォーム処理の詳細

formvalue（またはfv）とsubmitコマンドには暗黙の依存関係があります。状況によっては、formvalueがどのフォームフィールドを指定したのか、あるいはどのフォームのsubmitフィールドが"クリック"されたのか、フィールド名に基づいて選択するつもりかを正確に判断することは、悩ましいことです。

ここではformvalueとsubmitがどのように働くかを擬似コードで示します。（関数twill.commands.browser.get_form）

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for each form on page:
    if supplied regexp pattern matches the form name, select

if no form name, try converting to an integer N & using N-1 as
an index into the list or forms on the page (i.e. form 1 is the
first form on the page).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for each form on page:
    if 指定の正規表現パタンがフォームの名前とマッチした, フォームを選択する

if フォームの名前がない, 整数に変換してみる & 変換結果を N とすれば、N-1 が、ページ上のフォームのリストの添字となる (たとえば、フォーム 1 はページにある最初のフォーム).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ここではformvalueとsubmitがどのようにフォームフィールドを扱うのかを擬似コードで示します（関数twill.commands.browser.get_form_field）

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
search current form for control name with exact match to fieldname;
if single (unique) match, select.

if no match, convert fieldname into a number and use as an index, if
possible.

if no match, search current form for control name with regexp match to fieldname;
if single (unique) match, select.

if *still* no match, look for exact matches to submit-button values.
if single (unique) match, select.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
現在のフォームから、コントロール名がfieldnameと完全に一致するものを検索します;
ひとつだけマッチしたとき（ユニーク）、これを選択します。

マッチしなかった場合、フィールド名が数値に変換できるときは、インデックスとして使用します。

マッチしなかった場合は、現在のフォームから正規表現でfieldnameに一致するコントロール名を検索します;
ひとつだけマッチしたとき（ユニーク）、これを選択します。

*なお*一致がなければ、submitボタンの値と完全一致するものを探します。
ひとつだけマッチしたとき（ユニーク）、これを選択します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

submitに関する擬似コードは次のとおりです。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if a form was _not_ previously selected by formvalue:
   if there's only one form on the page, select it.
   otherwise, fail.

if a field is not explicitly named:
   if a submit button was "clicked" with formvalue, use it.
   otherwise, use the first submit button on the form, if any.
otherwise:
   find the field using the same rules as formvalue

finally, if a button has been picked, submit using it;
otherwise, submit without using a button
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
フォームがまだformvalueによって選択されて_いない_場合:
  ページ上のフォームがひとつだけであれば、それを選択します。
  そうでないときは、failです。

フィールドが、明示的に名前で指定されていない場合:
  submitボタンがformvalueを指定して"クリック"された場合は、それを使用します。
  さもなくば、フォーム上の最初のsubmitボタンを使用します。
そうでなければ:
  formvalueと同じ規則を使用してフィールドを見つけます。

最後に、ボタンが選択されている場合は、それを使用してsubmitします;
そうでない場合は、ボタンを使用せずにsubmitします。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~