20.5. "urllib" --- URL による任意のリソースへのアクセス
*******************************************************

注釈: "urllib" モジュールは、Python 3 で "urllib.request",
  "urllib.parse", "urllib.error" に分割されて名称変更されました。
  *2to3* ツールが自動 的にソースコードのimportを修正します。また、
  Python 3 の "urllib.request.urlopen()" 関数は "urllib2.urlopen()" を
  移動したもの で、 "urllib.urlopen()" のほうは削除されています。

このモジュールはワールドワイドウェブ (World Wide Web) を介してデータを
取り寄せるための高レベルのインタフェースを提供します。特に、関数
"urlopen()" は組み込み関数 "open()" と同様に動作し、ファイル名の代わり
にファイルユニバーサルリソースロケータ (URL) を指定することができます
。いくつかの制限はあります --- URL は読み出し専用でしか開けませんし、
seek 操作を行うことはできません。

参考: より高水準の HTTP クライアントインターフェイスとしては
  Requests パッ ケージ がお奨めです。

バージョン 2.7.9 で変更: HTTPS URI の場合、 "urllib" は必要な証明書検
証とホスト名チェックを全てデフォルトで行います。

警告: Python の 2.7.9 より前のバージョンでは urllib は HTTPS URI の
  サーバ 証明書を検証しようとはしません。自己責任でお使いください!


20.5.1. 高レベルインタフェース
==============================

urllib.urlopen(url[, data[, proxies[, context]]])

   URL で表されるネットワーク上のオブジェクトを読み込み用に開きます。
   URL がスキーム識別子を持たないか、スキーム識別子が file: である場合
   、ローカルシステムのファイルが (*universal newlines* なしで) 開かれ
   ます。それ以外の場合はネットワーク上のどこかにあるサーバへのソケッ
   トを開きます。接続を作ることができない場合、例外 IOError が送出され
   ます。全ての処理がうまくいけば、ファイル類似のオブジェクトが返され
   ます。このオブジェクトは以下のメソッド: "read()", "readline()",
   "readlines()", "fileno()", "close()", "info()", "getcode()",
   "geturl()" をサポートします。また、*iterator* プロトコルも正しくサ
   ポートしています。注意: "read()" の引数を省略または負の値を指定して
   も、データストリームの最後まで読みこむ訳ではありません。ソケットか
   らすべてのストリームを読み込んだことを決定する一般的な方法は存在し
   ません。

   "info()", "getcode()", "geturl()" メソッドを除き、これらのメソッド
   はファイルオブジェクトと同じインタフェースを持っています --- このマ
   ニュアルの ファイルオブジェクト セクションを参照してください。 (こ
   のオブジェクトは組み込みのファイルオブジェクトではありませんが、ま
   れに本物の組み込みファイルオブジェクトが必要な場所で使うことができ
   ません)

   "info()" メソッドは開いた URL に関連付けられたメタ情報を含む
   "mimetools.Message" クラスのインスタンスを返します。 URL へのアクセ
   スメソッドが HTTP である場合、メタ情報中のヘッダ情報はサーバが HTML
   ページを返すときに先頭に付加するヘッダ情報です (Content-Length およ
   び Content-Type を含みます)。アクセスメソッドが FTP の場合、ファイ
   ル取得リクエストに応答してサーバがファイルの長さを返したときには (
   これは現在では普通になりましたが) Content-Length ヘッダがメタ情報に
   含められます。 Content-type ヘッダは MIME タイプが推測可能なときに
   メタ情報に含められます。アクセスメソッドがローカルファイルの場合、
   返されるヘッダ情報にはファイルの最終更新日時を表す Date エントリ、
   ファイルのサイズを示す Content-Length エントリ、そして推測されるフ
   ァイル形式の Content-Type エントリが含まれます。 "mimetools" モジュ
   ールを参照してください。

   "geturl()" メソッドはページの実際の URL を返します。場合によっては
   、HTTP サーバはクライアントの要求を他の URL に振り向け (redirect 、
   リダイレクト ) します。関数 "urlopen()" はユーザに対してリダイレク
   トを透過的に行いますが、呼び出し側にとってクライアントがどの URL に
   リダイレクトされたかを知りたいときがあります。 "geturl()" メソッド
   を使うと、このリダイレクトされた URL を取得できます。

   "getcode()" メソッドは、レスポンスと共に送られてきたHTTPステータス
   コードを返します。 URLがHTTP URLでなかった場合は、 "None" を返しま
   す。

   *url* に "http:" スキーム識別子を使う場合、 *data* 引数を与えて
   "POST" 形式のリクエストを行うことができます (通常リクエストの形式は
   "GET" です)。引数 *data* は標準の *application/x-www-form-
   urlencoded* 形式でなければなりません; 以下の "urlencode()" 関数を参
   照してください。

   "urlopen()" 関数は認証を必要としないプロキシ (proxy) に対して透過的
   に動作します。Unix または Windows 環境では、 Python を起動する前に
   、環境変数 "http_proxy", "ftp_proxy" にそれぞれのプロキシサーバを指
   定する URL を設定してください。例えば ("'%'" はコマンドプロンプトで
   す):

      % http_proxy="http://www.someproxy.com:3128"
      % export http_proxy
      % python
      ...

   "no_proxy" 環境変数は、proxyを利用せずにアクセスするべきホストを指
   定するために利用されます。設定する場合は、カンマ区切りの、ホストネ
   ーム suffix のリストで、オプションとして ":port" を付けることができ
   ます。例えば、 "cern.ch,ncsa.uiuc.edu,some.host:8080".

   Windows 環境では、プロキシを指定する環境変数が設定されていない場合
   、プロキシの設定値はレジストリの Internet Settings セクションから取
   得されます。

   Mac OS X では、 "urlopen()" はプロキシの情報をシステム設定フレーム
   ワーク (Mac OS X System Configuration Framework) から取得します。こ
   れはシステム環境設定のネットワークパネルから設定できます。

   別の方法として、オプション引数 *proxies* を使って明示的にプロキシを
   設定することができます。この引数はスキーム名をプロキシの URL にマッ
   プする辞書型のオブジェクトでなくてはなりません。空の辞書を指定する
   とプロキシを使いません。 "None" (デフォルトの値です) を指定すると、
   上で述べたように環境変数で指定されたプロキシ設定を使います。例えば:

      # Use http://www.someproxy.com:3128 for HTTP proxying
      proxies = {'http': 'http://www.someproxy.com:3128'}
      filehandle = urllib.urlopen(some_url, proxies=proxies)
      # Don't use any proxies
      filehandle = urllib.urlopen(some_url, proxies={})
      # Use proxies from environment - both versions are equivalent
      filehandle = urllib.urlopen(some_url, proxies=None)
      filehandle = urllib.urlopen(some_url)

   認証を必要とするプロキシは現在のところサポートされていません。これ
   は実装上の制限 (implementation limitation) と考えています。

   *context* パラメータには "ssl.SSLContext" インスタンスをセットしま
   す。これは "urlopen()" が HTTPS 接続をするのに使う SSL 設定を構成し
   ます。

   バージョン 2.3 で変更: *proxies* のサポートを追加しました。

   バージョン 2.6 で変更: 結果オブジェクトに "getcode()" を追加し、
   "no_proxy" 環境変数に対応しました。

   バージョン 2.7.9 で変更: The *context* parameter was added.  All
   the neccessary certificate and hostname checks are done by default.

   バージョン 2.6 で非推奨: "urlopen()" 関数は Python 3 では
   "urllib2.urlopen()" を採用のため撤廃されています。

urllib.urlretrieve(url[, filename[, reporthook[, data[, context]]]])

   URL で表されるネットワーク上のオブジェクトを、必要に応じてローカル
   なファイルにコピーします。URL がローカルなファイルを指定していたり
   、オブジェクトのコピーが正しくキャッシュされていれば、そのオブジェ
   クトはコピーされません。タプル "(filename, headers)" を返し、
   *filename* はローカルで見つかったオブジェクトに対するファイル名で、
   *headers* は "urlopen()" が返した (おそらくキャッシュされているリモ
   ートの) オブジェクトに "info()" を適用して得られるものになります。
   "urlopen()" と同じ例外を送出します。

   The second argument, if present, specifies the file location to
   copy to (if absent, the location will be a tempfile with a
   generated name). The third argument, if present, is a callable that
   will be called once on establishment of the network connection and
   once after each block read thereafter.  The callable will be passed
   three arguments; a count of blocks transferred so far, a block size
   in bytes, and the total size of the file.  The third argument may
   be "-1" on older FTP servers which do not return a file size in
   response to a retrieval request.

   *url* が "http:" スキーム識別子を使っていた場合、オプション引数
   *data* を与えることで "POST" リクエストを行うよう指定することができ
   ます (通常リクエストの形式は "GET" です)。 *data* 引数は標準の
   *application/x-www-form-urlencoded* 形式でなくてはなりません; 以下
   の "urlencode()" 関数を参照してください。

   The *context* parameter may be set to a "ssl.SSLContext" instance
   to configure the SSL settings that are used if "urlretrieve()"
   makes a HTTPS connection.

   バージョン 2.5 で変更: "urlretrieve()" は、予想 (これは *Content-
   Length* ヘッダにより通知されるサイズです) よりも取得できるデータ量
   が少ないことを検知した場合、 "ContentTooShortError" を発生します。
   これは、例えば、ダウンロードが中断された場合などに発生します。
   *Content-Length* は下限として扱われます: より多いデータがある場合、
   "urlretrieve()" はそのデータを読みますが、より少ないデータしか取得
   できない場合、これは exception を発生します。このような場合にもダウ
   ンロードされたデータを取得することは可能で、これは exception インス
   タンスの "content" 属性に保存されています。*Content-Length* ヘッダ
   が無い場合、 "urlretrieve()" はダウンロードされたデータのサイズをチ
   ェックできず、単にそれを返します。この場合は、ダウンロードは成功し
   たと見なす必要があります。

   バージョン 2.7.9 で変更: The *context* parameter was added.  All
   the neccessary certificate and hostname checks are done by default.

urllib._urlopener

   パブリック関数 "urlopen()" および "urlretrieve()" は
   "FancyURLopener" クラスのインスタンスを生成します。インスタンスは要
   求された動作に応じて使用されます。この機能をオーバライドするために
   、プログラマは "URLopener" または "FancyURLopener" のサブクラスを作
   り、そのクラスから生成したインスタンスを変数 "urllib._urlopener" に
   代入した後、呼び出したい関数を呼ぶことができます。例えば、アプリケ
   ーションが "URLopener" が定義しているのとは異なった *User-Agent* ヘ
   ッダを指定したい場合があるかもしれません。この機能は以下のコードで
   実現できます:

      import urllib

      class AppURLopener(urllib.FancyURLopener):
          version = "App/1.7"

      urllib._urlopener = AppURLopener()

urllib.urlcleanup()

   以前の "urlretrieve()" で生成された可能性のあるキャッシュを消去しま
   す。


20.5.2. ユーティリティー関数
============================

urllib.quote(string[, safe])

   *string* に含まれる特殊文字を "%xx" エスケープで置換（quote）します
   。アルファベット、数字、および文字 "'_.-'" はに対しては quote 処理
   を行いません。この関数はデフォルトでは URL の path セクションに対す
   るクォートを想定しています。オプションのパラメタ *safe* は quote 処
   理しない追加の文字を指定します --- デフォルトの値は "'/'" です。

   例: "quote('/~connolly/')" は "'/%7econnolly/'" になります。

urllib.quote_plus(string[, safe])

   "quote()" と似ていますが、加えて空白文字をプラス記号 ("+") に置き換
   えます。これは HTML フォームの値をURLに付加するクエリ文字列にする際
   に必要な機能です。もとの文字列におけるプラス記号は *safe* に含まれ
   ていない限りエスケープ置換されます。上と同様に、 *safe* のデフォル
   トの値は "'/'" です。

urllib.unquote(string)

   "%xx" エスケープをエスケープが表す 1 文字に置き換えます。

   例: "unquote('/%7Econnolly/')" は "'/~connolly/'" になります。

urllib.unquote_plus(string)

   "unquote()" と似ていますが、加えてプラス記号を空白文字に置き換えま
   す。これは quote 処理された HTML フォームの値を元に戻すのに必要な機
   能です。

urllib.urlencode(query[, doseq])

   マップ型オブジェクト、または 2要素のタプルからなるシーケンスを、 "
   パーセントエンコードされた (percent-encoded)" 文字列に変換して、上
   述の "urlopen()" のオプション引数 *data* に適した形式にします。この
   関数はフォームのフィールド値でできた辞書を "POST" 型のリクエストに
   渡すときに便利です。返される文字列は "key=value" のペアを "'&'" で
   区切ったシーケンスで、 *key* と *value* の双方は上の "quote_plus()"
   でクォートされます。 2つの要素をもったタプルからなるシーケンスが引
   数 *query* として使われた場合、各タプルの最初の値が key で、2 番目
   の値が value になります。どちらのケースでも *value* にはシーケンス
   を入れることができ、その場合オプションのパラメタ *doseq* の評価結果
   が "True" であったなら、その *key* の各々の *value* に対して "'&'"
   で区切られた "key=value" のペアが生成されます。このときエンコードさ
   れた文字列中のパラメタの順番はシーケンス中のタプルの順番と同じにな
   ります。 "urlparse" モジュールでは、関数 "parse_qs()" および
   "parse_qsl()" を提供しており、クエリ文字列を解析して Python のデー
   タ構造にするのに利用できます。

urllib.pathname2url(path)

   ローカルシステムにおける記法で表されたパス名 *path* を、URL におけ
   るパス部分の形式に変換します。この関数は完全な URL を生成するわけで
   はありません。返される値は常に "quote()" を使って quote 処理された
   ものになります。

urllib.url2pathname(path)

   URL のパスの部分 *path* をパーセントエンコードされた URL の形式から
   ローカルシステムにおけるパス記法に変換します。この関数は *path* を
   デコードするために "unquote()" を使います。

urllib.getproxies()

   このヘルパー関数はスキーマからプロキシサーバーのURLへのマッピングを
   行う辞書を返します。この関数はまず、どのOSでも最初に
   "<scheme>_proxy" という名前の環境変数を大文字小文字を区別せずにスキ
   ャンします。そこで見つからなかった場合、 Max OS X の場合は Mac OSX
   システム環境設定を、 Windows の場合はシステムレジストリを参照します
   。もし小文字と大文字の環境変数が両方存在する (そして値が一致しない)
   なら、小文字の環境変数が優先されます。

   注釈: もし環境変数 "REQUEST_METHOD" が設定されていたら (これは通
     常スク リプトが CGI 環境で動いていることを示しています)、環境変数
     "HTTP_PROXY" (大文字の "_PROXY") は無視されます。その理由は、クラ
     イアントが "Proxy:" HTTP ヘッダーを使ってこの環境変数を注入できる
     からです。もし CGI 環境で HTTP プロキシを使う必要があれば、
     "ProxyHandler" を明示的に使用するか、環境変数名を小文字にしてくだ
     さい (あるいは、少なくともサフィックスを "_proxy" にしてください)
     。

注釈: urllib はある種のユーティリティ関数、 splittype, splithost や
  その他 URL をパースしてコンポーネントに分解するようなものを剥き出し
  にしてお りますが、これらを使うのではなくて、URL のパースには
  "urlparse" を使 ってください。Python 3 では "urllib.parse" でこれら
  ヘルパ関数は曝し ていません。


20.5.3. URL Opener オブジェクト
===============================

class urllib.URLopener([proxies[, context[, **x509]]])

   URL をオープンし、読み出すためのクラスの基底クラスです。"http:",
   "ftp:", "file:" 以外のスキームを使ったオブジェクトのオープンをサポ
   ートしたいのでないかぎり、"FancyURLopener" を使おうと思うことになる
   でしょう。

   デフォルトでは、 "URLopener" クラスは *User-Agent* ヘッダとして
   "urllib/VVV" を送信します。ここで *VVV* は "urllib" のバージョン番
   号です。アプリケーションで独自の *User-Agent* ヘッダを送信したい場
   合は、 "URLopener" かまたは "FancyURLopener" のサブクラスを作成し、
   サブクラス定義においてクラス属性 "version" を適切な文字列値に設定す
   ることで行うことができます。

   オプションのパラメーター *proxies* はスキーム名をプロキシの URL に
   マップする辞書でなければなりません。空の辞書はプロキシ機能を完全に
   オフにします。デフォルトの値は "None" で、この場合、 "urlopen()" の
   定義で述べたように、プロキシを設定する環境変数が存在するならそれを
   使います。

   *context* パラメータは指定する場合 "ssl.SSLContext" インスタンスで
   す。与えられた場合、これは URL をオープンするオブジェクトが HTTPS
   接続をするのに使う SSL 設定を定義します。

   追加のキーワードパラメーターは *x509* に集められますが、これは
   "https:" スキームを使った際のクライアント認証に使われることがありま
   す。キーワード引数 *key_file* および *cert_file* が SSL 鍵と証明書
   を設定するためにサポートされています; クライアント認証をするには両
   方が必要です。

   "URLopener" オブジェクトは、サーバがエラーコードを返した時には
   "IOError" を発生します。

   バージョン 2.7.9 で変更: The *context* parameter was added.  All
   the neccessary certificate and hostname checks are done by default.

   open(fullurl[, data])

      適切なプロトコルを使って *fullurl* を開きます。このメソッドはキ
      ャッシュとプロキシ情報を設定し、その後適切な open メソッドを入力
      引数つきで呼び出します。認識できないスキームが与えられた場合、
      "open_unknown()" が呼び出されます。 *data* 引数は "urlopen()" の
      引数 *data* と同じ意味を持っています。

   open_unknown(fullurl[, data])

      オーバライド可能な、未知のタイプの URL を開くためのインタフェー
      スです。

   retrieve(url[, filename[, reporthook[, data]]])

      *url* のコンテンツを取得し、 *filename* に書き込みます。返り値は
      タプルで、ローカルシステムにおけるファイル名と、応答ヘッダを含む
      "mimetools.Message" オブジェクト(URLがリモートを指している場合)
      、または "None"  (URL がローカルを指している場合) からなります。
      呼び出し側の処理はその後 *filename* を開いて内容を読み出さなくて
      はなりません。 *filename* が与えられており、かつ URL がローカル
      システム上のファイルを示している場合、入力ファイル名が返されます
      。 URL がローカルのファイルを示しておらず、かつ *filename* が与
      えられていない場合、ファイル名は入力 URL の最後のパス構成要素に
      つけられた拡張子と同じ拡張子を "tempfile.mktemp()" につけたもの
      になります。 *reporthook* を与える場合、この変数は 3 つの数値パ
      ラメタを受け取る関数でなくてはなりません。この関数はデータの塊
      (chunk) がネットワークから読み込まれるたびに呼び出されます。ロー
      カルの URL を与えた場合 *reporthook* は無視されます。

      *url* が "http:" スキーム識別子を使っていた場合、オプション引数
      *data* を与えることで "POST" リクエストを行うよう指定することが
      できます (通常リクエストの形式は "GET" です)。 *data* 引数は標準
      の *application/x-www-form-urlencoded* 形式でなくてはなりません;
      以下の "urlencode()" 関数を参照してください。

   version

      URL をオープンするオブジェクトのユーザエージェントを指定する変数
      です。 "urllib" を特定のユーザエージェントであるとサーバに通知す
      るには、サブクラスの中でこの値をクラス変数として値を設定するか、
      コンストラクタの中でベースクラスを呼び出す前に値を設定してくださ
      い。

class urllib.FancyURLopener(...)

   "FancyURLopener" は "URLopener" のサブクラスで、以下の HTTP レスポ
   ンスコード: 301、302、303、 307、および 401 を取り扱う機能を提供し
   ます。レスポンスコード 30x に対しては、 *Location* ヘッダを使って実
   際の URL を取得します。レスポンスコード 401 (認証が要求されているこ
   とを示す) に対しては、BASIC認証 (basic HTTP authintication) が行わ
   れます。レスポンスコード 30x に対しては、最大で *maxtries* 属性に指
   定された数だけ再帰呼び出しを行うようになっています。この値はデフォ
   ルトで 10 です。

   その他のレスポンスコードについては、 "http_error_default()" が呼ば
   れます。これはサブクラスでエラーを適切に処理するようにオーバーライ
   ドすることができます。

   注釈: **RFC 2616** によると、 POST 要求に対する 301 および 302 応
     答はユ ーザの承認無しに自動的にリダイレクトしてはなりません。実際
     は、こ れらの応答に対して自動リダイレクトを許すブラウザでは POST
     を GET に変更しており、 "urllib" でもこの動作を再現します。

   コンストラクタに与えるパラメーターは "URLopener" と同じです。

   注釈: 基本的な HTTP 認証を行う際、 "FancyURLopener" インスタンス
     は "prompt_user_passwd()" メソッドを呼び出します。このメソッドは
     デフ ォルトでは実行を制御している端末上で認証に必要な情報を要求す
     るよ うに実装されています。必要ならば、このクラスのサブクラスにお
     いて より適切な動作をサポートするために "prompt_user_passwd()" メ
     ソッ ドをオーバライドしてもかまいません。

   "FancyURLopener" クラスはオーバライド可能な追加のメソッドを提供して
   おり、適切な振る舞いをさせることができます:

   prompt_user_passwd(host, realm)

      指定されたセキュリティ領域 (security realm) 下にある与えられたホ
      ストにおいて、ユーザー認証に必要な情報を返すための関数です。この
      関数が返す値は "(user, password)" からなるタプルでなければなりま
      せん。値は Basic 認証で使われます。

      このクラスでの実装では、端末に情報を入力するようプロンプトを出し
      ます; ローカルの環境において適切な形で対話型モデルを使うには、こ
      のメソッドをオーバライドしなければなりません。

exception urllib.ContentTooShortError(msg[, content])

   この例外は "urlretrieve()" 関数が、ダウンロードされたデータの量が予
   期した量 (*Content-Length* ヘッダで与えられる) よりも少ないことを検
   知した際に発生します。 "content" 属性には (恐らく途中までの) ダウン
   ロードされたデータが格納されています。

   バージョン 2.5 で追加.


20.5.4. "urllib" の制限
=======================

* 現在のところ、以下のプロトコルだけがサポートされています: HTTP、 (
  バ ージョン 0.9 および 1.0)、 FTP、およびローカルファイル。

* "urlretrieve()" のキャッシュ機能は、有効期限ヘッダ (Expiration
  time header) を正しく処理できるようにハックするための時間を取れるま
  で、無 効にしてあります。

* ある URL がキャッシュにあるかどうか調べるような関数があればと思っ
  て います。

* 後方互換性のため、 URL がローカルシステム上のファイルを指している
  よ うに見えるにも関わらずファイルを開くことができなければ、 URL は
  FTP プロトコルを使って再解釈されます。この機能は時として混乱を招くエ
  ラー メッセージを引き起こします。

* 関数 "urlopen()" および "urlretrieve()" は、ネットワーク接続が確立
  さ れるまでの間、一定でない長さの遅延を引き起こすことがあります。こ
  のこ とは、これらの関数を使ってインタラクティブな Web クライアントを
  構築 するのはスレッドなしには難しいことを意味します。

* "urlopen()" または "urlretrieve()" が返すデータはサーバが返す生の
  デ ータです。このデータはバイナリデータ (画像データ等) 、生テキスト
  (plain text)、または (例えば) HTML でもかまいません。HTTP プロトコル
  はリプライヘッダ (reply header) にデータのタイプに関する情報を返しま
  す。タイプは *Content-Type* ヘッダを見ることで推測できます。返された
  データがHTML であれば、 "htmllib" を使ってパースすることができます。

* FTP プロトコルを扱うコードでは、ファイルとディレクトリを区別できま
  せ ん。このことから、アクセスできないファイルを指している URL からデ
  ー タを読み出そうとすると、予期しない動作を引き起こす場合があります
  。 URL が "/" で終わっていれば、ディレクトリを指しているものとみなし
  て 、それに適した処理を行います。しかし、ファイルの読み出し操作が
  550 エラー (URL が存在しないか、主にパーミッションの理由でアクセスで
  きな い) になった場合、 URL がディレクトリを指していて、末尾の "/"
  を忘れ たケースを処理するため、パスをディレクトリとして扱います。こ
  のために 、パーミッションのためにアクセスできないファイルを fetch し
  ようとす ると、FTP コードはそのファイルを開こうとして 550 エラーに陥
  り、次に ディレクトリ一覧を表示しようとするため、誤解を生むような結
  果を引き起 こす可能性があるのです。よく調整された制御が必要なら、
  "ftplib" モジ ュールを使うか、 "FancyURLopener" をサブクラス化するか
  、 *_urlopener* を変更して目的に合わせるよう検討してください。

* このモジュールは認証を必要とするプロキシをサポートしません。将来実
  装 されるかもしれません。

* "urllib" モジュールは URL 文字列を解釈したり構築したりする (ドキュ
  メ ント化されていない) ルーチンを含んでいますが、URL を操作するため
  のイ ンタフェースとしては、 "urlparse" モジュールをお勧めします。


20.5.5. 使用例
==============

以下は "GET" メソッドを使ってパラメータを含む URL を取得するセッション
の例です:

   >>> import urllib
   >>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
   >>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
   >>> print f.read()

以下は "POST" メソッドを代わりに使った例です:

   >>> import urllib
   >>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
   >>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
   >>> print f.read()

以下の例では、環境変数による設定内容に対して上書きする形で HTTP プロキ
シを明示的に設定しています:

   >>> import urllib
   >>> proxies = {'http': 'http://proxy.example.com:8080/'}
   >>> opener = urllib.FancyURLopener(proxies)
   >>> f = opener.open("http://www.python.org")
   >>> f.read()

以下の例では、環境変数による設定内容に対して上書きする形で、まったくプ
ロキシを使わないよう設定しています:

   >>> import urllib
   >>> opener = urllib.FancyURLopener({})
   >>> f = opener.open("http://www.python.org/")
   >>> f.read()
