"urllib.request" --- URL を開くための拡張可能なライブラリ
*********************************************************

**ソースコード:** Lib/urllib/request.py

======================================================================

"urllib.request" モジュールは基本的な認証、暗号化認証、リダイレクショ
ン、Cookie、その他の介在する複雑なアクセス環境において (大抵は HTTP で
) URL を開くための関数とクラスを定義します。

参考:

  より高水準のHTTPクライアントインターフェースとして *Requests package
  <https://requests.readthedocs.io/en/master/>* がお奨めです。

"urllib.request" モジュールでは以下の関数を定義しています:

urllib.request.urlopen(url, data=None[, timeout], *, cafile=None, capath=None, cadefault=False, context=None)

   URL *url* を開きます。 *url* は文字列でも "Request" オブジェクトで
   もかまいません。

   *data* はサーバーに送信する追加データを指定するオブジェクトであるか
   "None" である必要があります。詳細は "Request" を確認してください。

   urllib.request モジュールは HTTP/1.1 を使用し、その HTTP リクエスト
   に "Connection:close" ヘッダーを含みます。

   任意引数 *timeout* には接続開始などのブロックする操作におけるタイム
   アウト時間を秒数で指定します (指定されなかった場合、グローバルのデ
   フォルトタイムアウト時間が利用されます)。この引数は、 HTTP, HTTPS,
   FTP 接続でのみ有効です。

   *context* を指定する場合は、様々な SSL オプションを記述する
   "ssl.SSLContext" インスタンスでなければなりません。 詳細は
   "HTTPSConnection" を参照してください。

   任意引数 *cafile* および *capath* には HTTPS リクエストのための CA
   証明書のセットを指定します。*cafile* には CA 証明書のリストを含む 1
   個のファイルを指定し、*capath* にはハッシュ化された証明書ファイルが
   格納されたディレクトリを指定しなければなりません。より詳しい情報は
   "ssl.SSLContext.load_verify_locations()" を参照してください。

   *cadefault* 引数は無視されます。

   この関数は常に *コンテキストマネージャ* として機能するオブジェクト
   を返します。このオブジェクトには以下のメソッドがあります。

   * "geturl()" --- 取得されたリソースの URL を返します。 主に、リダイ
     レクトが発生したかどうかを確認するために利用します

   * "info()" --- return the meta-information of the page, such as
     headers, in the form of an "email.message_from_string()" instance
     (see Quick Reference to HTTP Headers)

   * "getcode()" -- レスポンスの HTTP ステータスコードです。

   HTTP および HTTPS URL の場合、この関数は、わずかに修正された
   "http.client.HTTPResponse" オブジェクトを返します。上記の3つの新し
   いメソッドに加えて、 msg 属性が "HTTPResponse" のドキュメンテーショ
   ンで指定されているレスポンスヘッダーの代わりに "reason" 属性 --- サ
   ーバーから返された reason フレーズ --- と同じ情報を含んでいます。

   FTP 、ファイルおよびデータ URL 、レガシーな "URLopener" や
   "FancyURLopener" によって明示的に扱われるリクエストの場合、この関数
   は "urllib.response.addinfourl" オブジェクトを返します。

   プロトコルエラー発生時は "URLError" を送出します。

   どのハンドラもリクエストを処理しなかった場合には "None" を返すこと
   があるので注意してください (デフォルトでインストールされる グローバ
   ルハンドラの "OpenerDirector" は、 "UnknownHandler" を使って上記の
   問題が起きないようにしています)。

   さらに、プロキシ設定が検出された場合(例えば "http_proxy" のような
   "*_proxy" 環境変数がセットされているなど)には "ProxyHandler" がデフ
   ォルトでインストールされ、これがプロキシを通してリクエストを処理す
   るようにしています。

   Python 2.6 以前のレガシーな "urllib.urlopen" 関数は廃止されました。
   "urllib.request.urlopen()" が過去の "urllib2.urlopen" に相当します
   。"urllib.urlopen" において辞書型オブジェクトで渡していたプロキシの
   扱いは、"ProxyHandler" オブジェクトを使用して取得できます。

   引数 "fullurl", "data", "headers", "method" を指定して 監査イベント
   "urllib.Request`" を送出します。

   バージョン 3.2 で変更: *cafile* および *capath* が追加されました。

   バージョン 3.2 で変更: HTTPS バーチャルホストがサポートされました
   ("ssl.HAS_SNI" が真の場合のみ)。

   バージョン 3.2 で追加: *data* にイテラブルなオブジェクトを指定でき
   るようになりました。

   バージョン 3.3 で変更: *cadefault* が追加されました。

   バージョン 3.4.3 で変更: *context* が追加されました。

   バージョン 3.6 で非推奨: *cafile*, *capath* および *cadefault* は非
   推奨となったので、 *context* を使ってください。 代わりに
   "ssl.SSLContext.load_cert_chain()" を使うか、または
   "ssl.create_default_context()" にシステムが信頼する CA 証明書を選ん
   でもらうかしてください。

urllib.request.install_opener(opener)

   指定された "OpenerDirector" のインスタンスを、デフォルトで利用され
   るグローバルの opener としてインストールします。 opener のインスト
   ールは、 urlopen にその opener を使って欲しいとき以外必要ありません
   。普段は単に "urlopen()" の代わりに "OpenerDirector.open()" を利用
   してください。この関数は引数が本当に "OpenerDirector" のインスタン
   スであるかどうかはチェックしません。適切なインタフェースを持った任
   意のクラスを利用することができます。

urllib.request.build_opener([handler, ...])

   与えられた順番に URL ハンドラを連鎖させる "OpenerDirector"  のイン
   スタンスを返します。 *handler* は "BaseHandler" または
   "BaseHandler" のサブクラスのインスタンスのどちらかです (どちらの場
   合も、コンストラクトは引数無しで呼び出せるようになっていなければな
   りません) 。クラス  "ProxyHandler" (proxy 設定が検出された場合),
   "UnknownHandler", "HTTPHandler", "HTTPDefaultErrorHandler",
   "HTTPRedirectHandler", "FTPHandler", "FileHandler",
   "HTTPErrorProcessor" については、そのクラスのインスタンスか、そのサ
   ブクラスのインスタンスが *handler*  に含まれていない限り、
   *handler* よりも先に連鎖します。

   Python が SSL をサポートするように設定してインストールされている場
   合 (すなわち、 "ssl" モジュールを import できる場合) "HTTPSHandler"
   も追加されます。

   "BaseHandler" サブクラスでも "handler_order" メンバー変数を変更して
   、ハンドラーリスト内での場所を変更できます。

urllib.request.pathname2url(path)

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

urllib.request.url2pathname(path)

   URL の、パーセントエンコードされたパス部分 *path* をローカルシステ
   ムの記法に変換します。これは完全な URL を受け付けません。*path* の
   デコードには "unquote()" 関数を使用します。

urllib.request.getproxies()

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

   注釈:

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

以下のクラスが提供されています:

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

   このクラスは URL リクエストを抽象化したものです。

   *url* は有効な URL を指す文字列でなくてはなりません。

   *data* must be an object specifying additional data to send to the
   server, or "None" if no such data is needed.  Currently HTTP
   requests are the only ones that use *data*.  The supported object
   types include bytes, file-like objects, and iterables of bytes-like
   objects. If no "Content-Length" nor "Transfer-Encoding" header
   field has been provided, "HTTPHandler" will set these headers
   according to the type of *data*.  "Content-Length" will be used to
   send bytes objects, while "Transfer-Encoding: chunked" as specified
   in **RFC 7230**, Section 3.3.1 will be used to send files and other
   iterables.

   HTTP POST リクエストメソッドでは *data* は標準の *application/x
   -www-form-urlencoded* 形式のバッファーでなければなりません。
   "urllib.parse.urlencode()" 関数は、マップ型あるいは 2 タプルのシー
   ケンスを取り、この形式の ASCII 文字列を返します。これは *data* パラ
   メーターとして使用される前に bytes 型にエンコードされなければなりま
   せん。

   *headers* は辞書でなければなりません。この辞書は "add_header()" を
   辞書のキーおよび値を引数として呼び出した時と同じように扱われます。
   この引数は、多くの場合ブラウザーが何であるかを特定する "User-Agent"
   ヘッダーの値を "偽装" するために用いられます。これは一部の HTTP サ
   ーバーが、スクリプトからのアクセスを禁止するために一般的なブラウザ
   ーの "User-Agent" ヘッダーしか許可しないためです。例えば、 Mozilla
   Firefox は "User-Agent" に ""Mozilla/5.0 (X11; U; Linux i686)
   Gecko/20071127 Firefox/2.0.0.11"" のように設定し、 "urllib" はデフ
   ォルトで ""Python-urllib/2.6"" (Python 2.6の場合) と設定します。

   An appropriate "Content-Type" header should be included if the
   *data* argument is present.  If this header has not been provided
   and *data* is not None, "Content-Type: application/x-www-form-
   urlencoded" will be added as a default.

   次の2つの引数は、サードパーティの HTTP クッキーを正しく扱いたい場合
   にのみ関係してきます:

   *origin_req_host* は、 **RFC 2965** で定義されている元のトランザク
   ションにおけるリクエストホスト (request-host of the origin
   transaction) です。デフォルトの値は
   "http.cookiejar.request_host(self)" です。この値は、ユーザーによっ
   て開始された元々のリクエストにおけるホスト名や IP アドレスです。例
   えば、もしリクエストがある HTML ドキュメント内の画像を指していれば
   、この値は画像を含んでいるページへのリクエストにおけるリクエストホ
   ストになるはずです。

   *unverifiable* は、 **RFC 2965** の定義において、該当するリクエスト
   が証明不能 (unverifiable) であるかどうかを示します。デフォルトの値
   は "False" です。証明不能なリクエストとは、ユーザが受け入れの可否を
   選択できないような URL を持つリクエストのことです。例えば、リクエス
   トが HTML ドキュメント中の画像であり、ユーザがこの画像を自動的に取
   得するか どうかを選択できない場合には、証明不能フラグは True になり
   ます。

   *method* は使用される HTTP リクエストメソッド (例: "'HEAD'") を示す
   文字列でなければなりません。もし与えられた場合、この値は属性
   "method" に格納され、 "get_method()" で使用されます。デフォルトは
   *data* が "None" であれば "'GET'" で、そうでなければ "'POST'" です
   。サブクラスは "method" 属性をクラス自身に設定して、異なるデフォル
   トメソッドを示すことができます。

   注釈:

     The request will not work as expected if the data object is
     unable to deliver its content more than once (e.g. a file or an
     iterable that can produce the content only once) and the request
     is retried for HTTP redirects or authentication.  The *data* is
     sent to the HTTP server right away after the headers.  There is
     no support for a 100-continue expectation in the library.

   バージョン 3.3 で変更: 引数 "Request.method" が Request クラスに追
   加されました。

   バージョン 3.4 で変更: "Request.method" のデフォルト値はクラスレベ
   ルで指定されることがあります。

   バージョン 3.6 で変更: Do not raise an error if the "Content-
   Length" has not been provided and *data* is neither "None" nor a
   bytes object. Fall back to use chunked transfer encoding instead.

class urllib.request.OpenerDirector

   "OpenerDirector" クラスは、 "BaseHandler" の連鎖的に呼び出して URL
   を開きます。このクラスはハンドラをどのように連鎖させるか、またどの
   ようにエラーをリカバリするかを管理します。

class urllib.request.BaseHandler

   このクラスはハンドラ連鎖に登録される全てのハンドラがベースとしてい
   るクラスです -- このクラスでは登録のための単純なメカニズムだけを扱
   います。

class urllib.request.HTTPDefaultErrorHandler

   HTTP エラーレスポンスのデフォルトハンドラーを定義するクラスです; す
   べてのレスポンスは "HTTPError" 例外に変換されます。

class urllib.request.HTTPRedirectHandler

   リダイレクションを扱うクラスです。

class urllib.request.HTTPCookieProcessor(cookiejar=None)

   HTTP Cookie を扱うためのクラスです。

class urllib.request.ProxyHandler(proxies=None)

   このクラスはプロキシを通過してリクエストを送らせます。引数
   *proxies* を与える場合、プロトコル名からプロキシの URL へ対応付ける
   辞書でなくてはなりません。標準では、プロキシのリストを環境変数
   "<protocol>_proxy" から読み出します。プロキシ環境変数が設定されてい
   ない場合は、 Windows 環境では、 レジストリのインターネット設定セク
   ションからプロキシ設定を手に入れ、 Mac OS X 環境では、 OS X システ
   ム設定フレームワーク (System Configuration Framework) からプロキシ
   情報を取得します。

   自動検出されたproxyを無効にするには、空の辞書を渡してください。

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

      注釈:

        変数 "REQUEST_METHOD" が設定されている場合、 "HTTP_PROXY" は無
        視されます; "getproxies()" のドキュメンテーションを参照してく
        ださい。

class urllib.request.HTTPPasswordMgr

   "(realm, uri) -> (user, password)" の対応付けデータベースを保持しま
   す。

class urllib.request.HTTPPasswordMgrWithDefaultRealm

   "(realm, uri) -> (user, password)"  の対応付けデータベースを保持し
   ます。レルム "None" はその他諸々のレルムを表し、他のレルムが該当し
   ない場合に検索されます。

class urllib.request.HTTPPasswordMgrWithPriorAuth

   "uri -> is_authenticated" マッピングのデータベースも持つ
   "HTTPPasswordMgrWithDefaultRealm" のバリエーションです。最初に
   "401" レスポンスを待つのではなく直ちに認証情報を送るときの条件を判
   断するために、 BasicAuth ハンドラによって使われます。

   バージョン 3.5 で追加.

class urllib.request.AbstractBasicAuthHandler(password_mgr=None)

   これは、リモートホストとプロキシの両方に対して HTTP 認証を行うこと
   を助ける mixin クラスです。 *password_mgr* は、もし与えられたら
   "HTTPPasswordMgr" と互換性のあるオブジェクトでなければなりません;
   サポートすべきインタフェースに関する情報は HTTPPasswordMgr オブジェ
   クト 節を参照してください。もし *passwd_mgr* が "is_authenticated"
   と "update_authenticated" メソッドも提供するなら
   (HTTPPasswordMgrWithPriorAuth オブジェクト を参照)、ハンドラは与え
   られた URI に対する "is_authenticated" の結果を用いてリクエストにお
   いて認証情報を送るかどうかを決定します。もし "is_authenticated" が
   その URI に対して "True" を返すなら、認証情報が送られます。
   "is_authenticated" が "False" なら認証情報は送られません。そして、
   もし "401" レスポンスを受け取ったら、認証情報を付けて改めてリクエス
   トが送信されます。もし認証が成功したら、それ以降その URI またはその
   親 URI に対して行われるリクエストが認証情報を自動的に含むように、
   URI に対して "is_authenticated" を "True" に設定するために
   "update_authenticated" が呼ばれます。

   バージョン 3.5 で追加: "is_authenticated" サポートが追加されました
   。

class urllib.request.HTTPBasicAuthHandler(password_mgr=None)

   遠隔ホストとの間での認証を扱います。 *password_mgr* を与える場合、
   "HTTPPasswordMgr" と互換性がなければなりません; 互換性のためにサポ
   ートしなければならないインタフェースについての情報はセクション
   HTTPPasswordMgr オブジェクト を参照してください。
   HTTPBasicAuthHandler は、間違った認証スキーマが与えられると
   "ValueError" を送出します。

class urllib.request.ProxyBasicAuthHandler(password_mgr=None)

   プロキシとの間での認証を扱います。 *password_mgr* を与える場合、
   "HTTPPasswordMgr" と互換性が なければなりません;  互換性のためにサ
   ポートしなければならないインタフェースについての情報はセクション
   HTTPPasswordMgr オブジェクト を参照してください。

class urllib.request.AbstractDigestAuthHandler(password_mgr=None)

   このクラスはHTTP 認証を補助するための混ぜ込みクラス (mixin class)
   です。遠隔ホストとプロキシの両方に対応しています。 *password_mgr*
   を与える場合、 "HTTPPasswordMgr" と互換性がなければなりません; 互換
   性のためにサポートしなければならないインタフェースについての情報は
   セクション HTTPPasswordMgr オブジェクト を参照してください。

class urllib.request.HTTPDigestAuthHandler(password_mgr=None)

   リモートホストとの認証を扱います。*password_mgr* を与える場合、
   "HTTPPasswordMgr" と互換性のあるものでなければなりません。サポート
   しなければならないインターフェースについての情報は HTTPPasswordMgr
   オブジェクト 節を参照してください。Digest 認証ハンドラーと Basic 認
   証ハンドラーの両方が追加された場合、常に Digest 認証を先に試みます
   。Digest 認証が 40x のレスポンスを再び返すと、Basic 認証ハンドラー
   に送信されます。このハンドラーメソッドは、Digest および Basic 以外
   の認証スキームが存在する場合は "ValueError" を送出します。

   バージョン 3.3 で変更: 未サポートの認証スキームでは "ValueError" を
   送出するようになりました。

class urllib.request.ProxyDigestAuthHandler(password_mgr=None)

   プロキシとの間での認証を扱います。 *password_mgr* を与える場合、
   "HTTPPasswordMgr" と互換性が なければなりません;  互換性のためにサ
   ポートしなければならないインタフェースについての情報はセクション
   HTTPPasswordMgr オブジェクト を参照してください。

class urllib.request.HTTPHandler

   HTTP の URL を開きます。

class urllib.request.HTTPSHandler(debuglevel=0, context=None, check_hostname=None)

   HTTPS で URL を開きます。*context* および *check_hostname* は
   "http.client.HTTPSConnection" のものと同じ意味です。

   バージョン 3.2 で変更: *context* および *check_hostname* が追加され
   ました。

class urllib.request.FileHandler

   ローカルファイルを開きます。

class urllib.request.DataHandler

   data URL を開きます。

   バージョン 3.4 で追加.

class urllib.request.FTPHandler

   FTP の URL を開きます。

class urllib.request.CacheFTPHandler

   FTP の URL を開きます。遅延を最小限にするために、開かれている FTP
   接続に対するキャッシュを保持します。

class urllib.request.UnknownHandler

   その他諸々のためのクラスで、未知のプロトコルの URL を開きます。

class urllib.request.HTTPErrorProcessor

   HTTP エラー応答の処理をします。


Request オブジェクト
====================

以下のメソッドは "Request" の公開インターフェースについて説明していま
す。これらはすべてサブクラスでオーバーライドできます。また、解析したリ
クエストを調査するためにクライアントで使用するいくつかの属性も定義しま
す。

Request.full_url

   コンストラクターに渡されたオリジナルの URL です。

   バージョン 3.4 で変更.

   Request.full_url は、 setter, getter, deleter を持つプロパティです
   。もし存在すれば、 "full_url" はオリジナルのリクエスト URL フラグメ
   ント付きで返します。

Request.type

   URI スキームです。

Request.host

   URI オーソリティです。通常はホスト名ですが、コロンで区切られたポー
   ト番号が付随することもあります。

Request.origin_req_host

   リクエストしたオリジナルのホスト名です。ポート番号はつきません。

Request.selector

   URI パスです。"Request" がプロキシを使用する場合、セレクターはプロ
   キシに渡される完全な URL になります。

Request.data

   リクエストのエンティティボディか、指定されない場合は "None" になり
   ます。

   バージョン 3.4 で変更: "Request.data" の値が変更されると、もしそれ
   以前に "Content-Length" ヘッダーの値が設定または計算されていたらヘ
   ッダーが削除されるようになりました。

Request.unverifiable

   リクエストが **RFC 2965** で定義された証明不能 (unverifiable) であ
   るかどうかを示す論理値です。

Request.method

   HTTP リクエストで使うメソッドです。 デフォルト値は "None" で、この
   ときは使うメソッドを "get_method()" が通常の方法で決定するというこ
   とになります。 この値を設定する (従って "get_method()" のデフォルト
   の決定を上書きする) 方法は、 "Request" サブクラスでのクラスレベルの
   設定処理でデフォルト値を提供するか、 "Request" のコンストラクタの
   *method* 引数へ値を渡すかです。

   バージョン 3.3 で追加.

   バージョン 3.4 で変更: サブクラスでデフォルト値が設定できるようにな
   りました; 以前はコンストラクタ引数からしか設定できませんでした。

Request.get_method()

   HTTP リクエストメソッドを示す文字列を返します。"Request.method" が
   "None" でなければその値を返します。そうでない場合、"Request.data"
   が "None" なら "'GET'" を、そうでなければ "'POST'" を返します。これ
   は HTTP リクエストに対してのみ意味を持ちます。

   バージョン 3.3 で変更: get_method は "Request.method" の値を参照す
   るようになりました。

Request.add_header(key, val)

   リクエストに新たなヘッダーを追加します。ヘッダーは HTTP ハンドラ以
   外のハンドラでは無視されます。HTTP ハンドラでは、引数はサーバに送信
   される ヘッダーのリストに追加されます。同じ名前を持つヘッダを 2 つ
   以上持つことはできず、 *key* の衝突が生じた場合、後で追加したヘッダ
   ーが前に 追加したヘッダーを上書きします。現時点では、この機能は
   HTTP の機能を損ねることはありません。というのは、複数回呼び出したと
   きに意味を 持つようなヘッダーには、どれもただ一つのヘッダーを使って
   同じ機能を果たすための (ヘッダー特有の) 方法があるからです。

Request.add_unredirected_header(key, header)

   リダイレクトされたリクエストには追加されないヘッダーを追加します。

Request.has_header(header)

   インスタンスが名前つきヘッダーであるかどうかを (通常のヘッダーと非
   リダイレクトヘッダの両方を調べて) 返します。

Request.remove_header(header)

   リクエストインスタンス (の通常のヘッダーと非リダイレクトヘッダーの
   両方) から名前つきヘッダーを削除します。

   バージョン 3.4 で追加.

Request.get_full_url()

   コンストラクタで与えられた URL を返します。

   バージョン 3.4 で変更.

   "Request.full_url" を返します。

Request.set_proxy(host, type)

   リクエストがプロキシサーバを経由するように準備します。 *host* およ
   び *type* はインスタンスのもとの設定と置き換えられ ます。インスタン
   スのセレクタはコンストラクタに与えたもともとの URL になります。

Request.get_header(header_name, default=None)

   指定されたヘッダーの値を返します。ヘッダーがない場合は、 *default*
   の値を返します。

Request.header_items()

   リクエストヘッダーの値を、タプル (header_name, header_value) のリス
   トで返します。

バージョン 3.4 で変更: 3.3 から非推奨だった Request オブジェクトのメソ
ッド add_data, has_data, get_data, get_type, get_host, get_selector,
get_origin_req_host, is_unverifiable が削除されました。


OpenerDirector オブジェクト
===========================

"OpenerDirector" インスタンスは以下のメソッドを持っています:

OpenerDirector.add_handler(handler)

   *handler* should be an instance of "BaseHandler".  The following
   methods are searched, and added to the possible chains (note that
   HTTP errors are a special case).  Note that, in the following,
   *protocol* should be replaced with the actual protocol to handle,
   for example "http_response()" would be the HTTP protocol response
   handler.  Also *type* should be replaced with the actual HTTP code,
   for example "http_error_404()" would handle HTTP 404 errors.

   * "<protocol>_open()" --- ハンドラーが *protocol* の URL を開く方法
     を知っているかどうかを調べます。

     詳細は、 "BaseHandler.<protocol>_open()" を参照してください。

   * "http_error_<type>()" --- ハンドラーが HTTP エラーコード *type*
     の処理方法を知っていることを示すシグナルです。

     詳細は、 "BaseHandler.http_error_<nnn>()" を参照してください。

   * "<protocol>_error()" --- ハンドラーが ("http" でない) *protocol*
     のエラーを処理する方法を知っていることを示すシグナルです。

   * "<protocol>_request()" --- ハンドラーが *protocol* リクエストのプ
     リプロセス方法を知っていることを示すシグナルです。

     詳細は、 "BaseHandler.<protocol>_request()" を参照してください。

   * "<protocol>_response()" --- ハンドラーが *protocol* リクエストの
     ポストプロセス方法を知っていることを示すシグナルです。

     詳細は、 "BaseHandler.<protocol>_response()" を参照してください。

OpenerDirector.open(url, data=None[, timeout])

   与えられた *url* (リクエストオブジェクトでも文字列でもかまいません)
   を開きます。オプションとして *data* を与えることができます。 引数、
   戻り値、および送出される例外は "urlopen()" と同じです ("urlopen()"
   の場合、標準でインストールされている グローバルな "OpenerDirector"
   の "open()" メソッドを呼び出します) 。 オプションの *timeout* 引数
   は、接続開始のようなブロックする処理におけるタイムアウト時間を 秒数
   で指定します。(指定しなかった場合は、グローバルのデフォルト設定が利
   用されます) タイムアウト機能は、 HTTP, HTTPS, FTP 接続でのみ有効で
   す。

OpenerDirector.error(proto, *args)

   与えられたプロトコルにおけるエラーを処理します。このメソッドは与え
   られたプロトコルにおける登録済みのエラーハンドラを (プロトコル固有
   の) 引数で呼び出します。 HTTP プロトコルは特殊なケースで、特定のエ
   ラーハンドラを選び出すのに HTTP レスポンスコードを使います; ハンド
   ラクラスの "http_error_<type>()" メソッドを参照してください。

   戻り値および送出される例外は "urlopen()" と同じものです。

OpenerDirector オブジェクトは、以下の 3 つのステージに分けて URL を開
きます:

各ステージで OpenerDirector オブジェクトのメソッドがどのような順で呼び
出されるかは、ハンドラインスタンスの並び方で決まります。

1. "<protocol>_request()" 形式のメソッドを持つすべてのハンドラーに対し
   てそのメソッドを呼び出し、リクエストのプリプロセスを行います。

2. "<protocol>_open()" のようなメソッドでハンドラーが呼び出され、リク
   エストを処理します。このステージではハンドラーが非-"None" 値 (例:
   レスポンス) か例外 (通常は "URLError") を返した時点で終了します。例
   外は伝搬できます。

   実際には、上のアルゴリズムではまず "default_open()" という名前のメ
   ソッドを呼び出します。このメソッドがすべて "None" を返す場合、同じ
   アルゴリズムを繰り返して、今度は "<protocol>_open()" 形式のメソッド
   を試します。メソッドがすべて "None" を返すと、さらに同じアルゴリズ
   ムを繰り返して "unknown_open()" を呼び出します。

   これらのメソッドの実装には、親となる "OpenerDirector" インスタンス
   の "open()" や "error()" といったメソッド呼び出しが入る場合があるの
   で注意してください。

3. "<protocol>_response()" 形式のメソッドを持つすべてのハンドラーに対
   してそのメソッドを呼び出し、リクエストのポストプロセスを行います。


BaseHandler オブジェクト
========================

"BaseHandler" オブジェクトは直接的に役に立つ 2 つのメソッドと、その他
として派生クラスで使われることを想定したメソッドを 提供します。以下は
直接的に使うためのメソッドです:

BaseHandler.add_parent(director)

   親オブジェクトとして、 "director" を追加します。

BaseHandler.close()

   全ての親オブジェクトを削除します。

以下の属性およびメソッドは "BaseHandler" から派生したクラスでのみ使わ
れます。

注釈:

  慣習的に、 "<protocol>_request()" や "<protocol>_response()" といっ
  たメソッドを定義している サブクラスは "*Processor" と名づけ、その他
  は "* Handler" と名づけることになっています

BaseHandler.parent

   有効な "OpenerDirector" です。この値は違うプロトコルを使って URL を
   開く場合やエラーを処理する際に使われます。

BaseHandler.default_open(req)

   このメソッドは "BaseHandler" では定義されて *いません* 。しかし、全
   ての URL をキャッチさせたいなら、サブクラスで定義する 必要がありま
   す。

   このメソッドが実装されていれば、"OpenerDirector" の親クラスによって
   呼び出されます。これは "OpenerDirector" の "open()" の戻り値で表さ
   れるファイルライクオブジェクトか、または "None" を返さなければなら
   ず、真に想定外の事態が発生した場合を除き、"URLError" を送出しなけれ
   ばなりません (例えば、"MemoryError" は "URLError" にマップしてはな
   りません)。

   このメソッドはプロトコル固有のオープンメソッドが呼び出される前に呼
   び出されます。

BaseHandler.<protocol>_open(req)

   このメソッドは "BaseHandler" では定義されて *いません* 。しかしプロ
   トコルの URL をキャッチしたいなら、サブクラスで定義する必要がありま
   す。

   このメソッドが定義されていた場合、 "OpenerDirector" から呼び出され
   ます。戻り値は "default_open()" と同じでなければなりません。

BaseHandler.unknown_open(req)

   このメソッドは "BaseHandler" では定義されて *いません* 。しかし URL
   を開くための特定のハンドラが登録されていないような URL をキャッチし
   たいなら、サブクラスで定義する必要があります。

   このメソッドが定義されていた場合、 "OpenerDirector" から呼び出され
   ます。戻り値は "default_open()" と同じでなければなりません。

BaseHandler.http_error_default(req, fp, code, msg, hdrs)

   このメソッドは "BaseHandler" では定義されて *いません* 。しかしその
   他の処理されなかった HTTP エラーを処理する機能をもたせたいなら、サ
   ブクラスで定義する必要があります。このメソッドはエラーに遭遇した
   "OpenerDirector" から自動的に呼び出されます。その他の状況では普通呼
   び出すべきではありません。

   *req* は "Request" オブジェクトで、 *fp* は HTTP エラー本体を読み出
   せるようなファイル類似のオブジェクトに なります。 *code* は 3 桁の
   10 進数からなるエラーコードで、 *msg* ユーザ向けのエラーコード解説
   です。 *hdrs* は エラー応答のヘッダーをマップしたオブジェクトです。

   返される値および送出される例外は "urlopen()" と同じものでなければな
   りません。

BaseHandler.http_error_<nnn>(req, fp, code, msg, hdrs)

   *nnn* は 3 桁の 10 進数からなる HTTP エラーコードでなくてはなりませ
   ん。このメソッドも "BaseHandler" では定義されていませんが、サブクラ
   スのインスタンスで定義されていた場合、エラーコード *nnn* の HTTP エ
   ラーが発生した際に呼び出されます。

   特定の HTTP エラーに対する処理を行うためには、このメソッドをサブク
   ラスでオーバライドする必要があります。

   引数、返される値、および送出される例外は "http_error_default()" と
   同じものでなければなりません。

BaseHandler.<protocol>_request(req)

   このメソッドは "BaseHandler" では *定義されていません* が、サブクラ
   スで特定のプロトコルのリクエストのプリプロセスを行いたい場合には定
   義する必要があります。

   このメソッドが定義されていると、親となる "OpenerDirector" から呼び
   出されます。その際、 *req* は "Request" オブジェクトになります。戻
   り値は "Request" オブジェクトでなければなりません。

BaseHandler.<protocol>_response(req, response)

   このメソッドは "BaseHandler" では *定義されていません* が、サブクラ
   スで特定のプロトコルのリクエストのポストプロセスを行いたい場合には
   定義する必要があります。

   このメソッドが定義されていると、親となる "OpenerDirector" から呼び
   出されます。その際、 *req* は "Request" オブジェクトになります。
   *response* は "urlopen()" の戻り値と同じインタフェースを 実装したオ
   ブジェクトになります。戻り値もまた、 "urlopen()" の戻り値と同じイン
   タフェースを実装したオブジェクトでなければなりません。


HTTPRedirectHandler オブジェクト
================================

注釈:

  一部の HTTP リクエストはこのモジュールのクライアントモードからの操作
  を要求します。その場合、"HTTPError" が送出されます。さまざまなリダイ
  レクションコードの正確な意味についての詳細は **RFC 2616** を参照して
  ください。セキュリティ上の配慮として、HTTPRedirectHandler に HTTP、
  HTTPS、あるいは FTP の URL ではないリダイレクトされた URL が存在した
  場合、"HTTPError" 例外が送出されます。

HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl)

   リダイレクトへのレスポンスの "Request" または "None" を返します。こ
   れはサーバーからリダイレクションを受信した時に "http_error_30*()"
   メソッドのデフォルトの実装によって呼び出されます。リダイレクション
   を行わなければならない場合、*newurl* へのリダイレクトを実行するため
   の "http_error_30*()" を許可する新しい "Request" を返します。その他
   の場合、この URL を扱うその他のハンドラーがない場合は "HTTPError"
   を、他のハンドラーでできそうな場合は "None" を返します。

   注釈:

     このメソッドのデフォルトの実装は、 **RFC 2616** に厳密に従ったも
     のではありません。 **RFC 2616** では、 "POST" リクエストに対する
     301 および 302 応答が、ユーザの承認なく自動的にリダイレクトされて
     はならないと述べています。現実には、ブラウザは POST を "GET" に変
     更することで、これらの応答に対して自動的にリダイレクトを行えるよ
     うにしています。デフォルトの実装でも、この挙動を再現しています。

HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs)

   "Location:" か "URI:" のURL にリダイレクトします。このメソッドは
   HTTP  における 'moved permanently' レスポンスを取得した際に 親オブ
   ジェクトとなる "OpenerDirector" によって呼び出されます。

HTTPRedirectHandler.http_error_302(req, fp, code, msg, hdrs)

   "http_error_301()" と同じですが、'found' レスポンスに対して呼び出さ
   れます。

HTTPRedirectHandler.http_error_303(req, fp, code, msg, hdrs)

   "http_error_301()" と同じですが、'see other' レスポンスに対して呼び
   出されます。

HTTPRedirectHandler.http_error_307(req, fp, code, msg, hdrs)

   "http_error_301()" と同じですが、'temporary redirect'  レスポンスに
   対して呼び出されます。


HTTPCookieProcessor オブジェクト
================================

"HTTPCookieProcessor" インスタンスは属性をひとつだけ持ちます:

HTTPCookieProcessor.cookiejar

   Cookie の入っている "http.cookiejar.CookieJar" オブジェクトです。


ProxyHandler オブジェクト
=========================

ProxyHandler.<protocol>_open(request)

   "ProxyHandler" は、コンストラクターで与えた辞書 *proxies* にプロキ
   シが設定されているような *protocol* すべてについて、メソッド
   "<protocol>_open()" を持つことになります。このメソッドは
   "request.set_proxy()" を呼び出して、リクエストがプロキシを通過でき
   るように修正します。その後連鎖するハンドラーの中から次のハンドラー
   を呼び出して実際にプロトコルを実行します。


HTTPPasswordMgr オブジェクト
============================

以下のメソッドは "HTTPPasswordMgr" および
"HTTPPasswordMgrWithDefaultRealm" オブジェクトで利用できます。

HTTPPasswordMgr.add_password(realm, uri, user, passwd)

   *uri* は単一の URI でも複数の URI からなるシーケンスでもかまいませ
   ん。 *realm* 、 *user* および *passwd* は文字列でなくてはなりません
   。このメソッドによって、 *realm* と与えられた URI の上位 URI に対し
   て "(user, passwd)" が認証トークンとして使われるようになります。

HTTPPasswordMgr.find_user_password(realm, authuri)

   与えられたレルムおよび URI に対するユーザ名またはパスワードがあれば
   それを取得します。該当するユーザ名／パスワードが存在しない場合、こ
   のメソッドは "(None, None)" を返します。

   "HTTPPasswordMgrWithDefaultRealm" オブジェクトでは、与えられた
   *realm* に対して該当するユーザ名/パスワードが存在しない場合、レルム
   "None" が検索されます。


HTTPPasswordMgrWithPriorAuth オブジェクト
=========================================

このパスワードマネージャは "HTTPPasswordMgrWithDefaultRealm" を継承し
て、認証の証明書を常に送らないといけない URI を追跡する機能をサポート
しています。

HTTPPasswordMgrWithPriorAuth.add_password(realm, uri, user, passwd, is_authenticated=False)

   *realm*, *uri*, *user*, *passwd* は
   "HTTPPasswordMgr.add_password()" のものと同じです。
   *is_authenticated* は、与えられた URI や URI のリストの
   "is_authenticated" フラグの初期値に設定されます。
   *is_authenticated* に "True" を指定した場合は、 *realm* は無視され
   ます。

HTTPPasswordMgrWithPriorAuth.find_user_password(realm, authuri)

   "HTTPPasswordMgrWithDefaultRealm" オブジェクトに対する同名のメソッ
   ドと同じです。

HTTPPasswordMgrWithPriorAuth.update_authenticated(self, uri, is_authenticated=False)

   与えられた *url* や URI のリストの "is_authenticated" フラグを更新
   します。

HTTPPasswordMgrWithPriorAuth.is_authenticated(self, authuri)

   与えられた URI の "is_authenticated" フラグの現在の状態を返します。


AbstractBasicAuthHandler オブジェクト
=====================================

AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers)

   ユーザ名／パスワードを取得し、再度サーバへのリクエストを試みること
   で、サーバからの認証リクエストを処理します。 *authreq* はリクエスト
   において レルムに関する情報が含まれているヘッダーの名前、 *host* は
   認証を行う対象の URL とパスを指定します、 *req* は (失敗した)
   "Request" オブジェクト、そして *headers* はエラーヘッダーでなくては
   なりません。

   *host* は、オーソリティ (例 ""python.org"") か、オーソリティコンポ
   ーネントを含む URL (例 ""http://python.org"") です。どちらの場合も
   、オーソリティはユーザ情報コンポーネントを含んではいけません (なの
   で、 ""python.org"" や ""python.org:80"" は正しく、
   ""joe:password@python.org"" は不正です) 。


HTTPBasicAuthHandler オブジェクト
=================================

HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs)

   認証情報がある場合、認証情報付きで再度リクエストを試みます。


ProxyBasicAuthHandler オブジェクト
==================================

ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs)

   認証情報がある場合、認証情報付きで再度リクエストを試みます。


AbstractDigestAuthHandler オブジェクト
======================================

AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers)

   *authreq* はリクエストにおいてレルムに関する情報が含まれているヘッ
   ダーの名前、 *host* は認証を行う対象のホスト名、 *req* は  (失敗し
   た) "Request" オブジェクト、そして *headers* はエラーヘッダーでなく
   てはなりません。


HTTPDigestAuthHandler オブジェクト
==================================

HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs)

   認証情報がある場合、認証情報付きで再度リクエストを試みます。


ProxyDigestAuthHandler オブジェクト
===================================

ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs)

   認証情報がある場合、認証情報付きで再度リクエストを試みます。


HTTPHandler オブジェクト
========================

HTTPHandler.http_open(req)

   HTTP リクエストを送ります。 "req.has_data()" に応じて、 GET または
   POST のどちらでも送ることができます。


HTTPSHandler オブジェクト
=========================

HTTPSHandler.https_open(req)

   HTTPS リクエストを送ります。 "req.has_data()" に応じて、 GET または
   POST のどちらでも送ることができます。


FileHandler オブジェクト
========================

FileHandler.file_open(req)

   ホスト名がない場合、またはホスト名が "'localhost'" の場合にファイル
   をローカルでオープンします。

   バージョン 3.2 で変更: このメソッドはローカルのホスト名に対してのみ
   適用可能です。リモートホスト名が与えられた場合、"URLError" が送出さ
   れます。


DataHandler オブジェクト
========================

DataHandler.data_open(req)

   Read a data URL. This kind of URL contains the content encoded in
   the URL itself. The data URL syntax is specified in **RFC 2397**.
   This implementation ignores white spaces in base64 encoded data
   URLs so the URL may be wrapped in whatever source file it comes
   from. But even though some browsers don't mind about a missing
   padding at the end of a base64 encoded data URL, this
   implementation will raise an "ValueError" in that case.


FTPHandler オブジェクト
=======================

FTPHandler.ftp_open(req)

   *req* で表されるファイルを FTP 越しにオープンします。ログインは常に
   空のユーザネームおよびパスワードで行われます。


CacheFTPHandler オブジェクト
============================

"CacheFTPHandler" オブジェクトは "FTPHandler" オブジェクトに以下のメソ
ッドを追加したものです:

CacheFTPHandler.setTimeout(t)

   接続のタイムアウトを *t* 秒に設定します。

CacheFTPHandler.setMaxConns(m)

   キャッシュ付き接続の最大接続数を *m* に設定します。


UnknownHandler オブジェクト
===========================

UnknownHandler.unknown_open()

   "URLError" 例外を送出します。


HTTPErrorProcessor オブジェクト
===============================

HTTPErrorProcessor.http_response(request, response)

   HTTP エラー応答の処理をします。

   エラーコード 200 の場合、レスポンスオブジェクトを即座に返します。

   200 以外のエラーコードの場合、これは単に "http_error_<type>()" ハン
   ドラーメソッドに "OpenerDirector.error()" 経由で処理を渡します。他
   にそのエラーを処理するハンドラーがない場合、
   "HTTPDefaultErrorHandler" は最後に "HTTPError" を送出します。

HTTPErrorProcessor.https_response(request, response)

   HTTPS エラー応答の処理をします。

   振る舞いは "http_response()" と同じです。


使用例
======

以下の例の他に urllib パッケージを使ってインターネット上のリソースを取
得するには に多くの例があります。

以下の例では、python.org のメインページを取得して、その最初の 300 バイ
ト分を表示します。

   >>> import urllib.request
   >>> with urllib.request.urlopen('http://www.python.org/') as f:
   ...     print(f.read(300))
   ...
   b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html
   xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n\n<head>\n
   <meta http-equiv="content-type" content="text/html; charset=utf-8" />\n
   <title>Python Programming '

urlopen は bytes オブジェクトを返すことに注意してください。これは
urlopen が、HTTP サーバーから受信したバイトストリームのエンコーディン
グを自動的に決定できないためです。一般に、返された bytes オブジェクト
を文字列にデコードするためのエンコーディングの決定あるいは推測はプログ
ラム側が行います。

以下の W3C ドキュメント https://www.w3.org/International/O-charsetには
(X)HTML や XML ドキュメントでそのエンコーディング情報を指定するさまざ
まな方法の一覧があります。

python.org ウェブサイトでは *utf-8* エンコーディングを使用しており、そ
れをその meta タグで指定していますので、bytes オブジェクトのデコードも
同様に行います。

   >>> with urllib.request.urlopen('http://www.python.org/') as f:
   ...     print(f.read(100).decode('utf-8'))
   ...
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtm

*コンテキストマネージャー* を使用しないアプローチでも同様の結果を得る
ことができます。

   >>> import urllib.request
   >>> f = urllib.request.urlopen('http://www.python.org/')
   >>> print(f.read(100).decode('utf-8'))
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtm

以下の例では、データストリームを CGI の標準入力へ送信し、返されたデー
タを読み込みます。この例は Python が SSL をサポートするように設定して
インストールされている場合のみ動作します。

   >>> import urllib.request
   >>> req = urllib.request.Request(url='https://localhost/cgi-bin/test.cgi',
   ...                       data=b'This data is passed to stdin of the CGI')
   >>> with urllib.request.urlopen(req) as f:
   ...     print(f.read().decode('utf-8'))
   ...
   Got Data: "This data is passed to stdin of the CGI"

上の例で使われているサンプルの CGI は以下のようになっています:

   #!/usr/bin/env python
   import sys
   data = sys.stdin.read()
   print('Content-type: text/plain\n\nGot Data: "%s"' % data)

これは "Request" を使った "PUT" リクエストの例です:

   import urllib.request
   DATA = b'some data'
   req = urllib.request.Request(url='http://localhost:8080', data=DATA,method='PUT')
   with urllib.request.urlopen(req) as f:
       pass
   print(f.status)
   print(f.reason)

以下はベーシック HTTP 認証の例です:

   import urllib.request
   # Create an OpenerDirector with support for Basic HTTP Authentication...
   auth_handler = urllib.request.HTTPBasicAuthHandler()
   auth_handler.add_password(realm='PDQ Application',
                             uri='https://mahler:8092/site-updates.py',
                             user='klem',
                             passwd='kadidd!ehopper')
   opener = urllib.request.build_opener(auth_handler)
   # ...and install it globally so it can be used with urlopen.
   urllib.request.install_opener(opener)
   urllib.request.urlopen('http://www.example.com/login.html')

"build_opener()" はデフォルトで沢山のハンドラを提供しており、その中に
"ProxyHandler" があります。デフォルトでは、 "ProxyHandler" は
"<scheme>_proxy" という環境変数を使います。 ここで "<scheme>" は URL
スキームです。例えば、 HTTP プロキシの URL を得るには、環境変数
"http_proxy" を読み出します。

この例では、デフォルトの "ProxyHandler" を置き換えてプログラム的に作成
したプロキシ URL を使うようにし、 "ProxyBasicAuthHandler" でプロキシ認
証サポートを追加します。

   proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
   proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
   proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

   opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
   # This time, rather than install the OpenerDirector, we use it directly:
   opener.open('http://www.example.com/login.html')

以下は HTTP ヘッダーを追加する例です:

*headers* 引数を使って "Request" コンストラクタを呼び出す方法の他に、
以下のようにできます:

   import urllib.request
   req = urllib.request.Request('http://www.example.com/')
   req.add_header('Referer', 'http://www.python.org/')
   # Customize the default User-Agent header value:
   req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
   r = urllib.request.urlopen(req)

"OpenerDirector" は全ての "Request" に *User-Agent* ヘッダーを自動的に
追加します。これを変更するには以下のようにします:

   import urllib.request
   opener = urllib.request.build_opener()
   opener.addheaders = [('User-agent', 'Mozilla/5.0')]
   opener.open('http://www.example.com/')

また、 "Request" が "urlopen()" (や "OpenerDirector.open()")に渡される
際には、いくつかの標準ヘッダー (*Content-Length*, *Content-Type* およ
び *Host*) も追加されることを忘れないでください。

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

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

以下の例では、"POST" メソッドを使用しています。urlencode から出力され
たパラメーターは urlopen にデータとして渡される前に bytes にエンコード
されていることに注意してください:

   >>> import urllib.request
   >>> import urllib.parse
   >>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
   >>> data = data.encode('ascii')
   >>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f:
   ...     print(f.read().decode('utf-8'))
   ...

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

   >>> import urllib.request
   >>> proxies = {'http': 'http://proxy.example.com:8080/'}
   >>> opener = urllib.request.FancyURLopener(proxies)
   >>> with opener.open("http://www.python.org") as f:
   ...     f.read().decode('utf-8')
   ...

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

   >>> import urllib.request
   >>> opener = urllib.request.FancyURLopener({})
   >>> with opener.open("http://www.python.org/") as f:
   ...     f.read().decode('utf-8')
   ...


レガシーインターフェース
========================

以下の関数およびクラスは、Python 2 のモジュール "urllib" ("urllib2" で
はありません) から移植されたものです。これらは将来的に廃止されるかもし
れません。

urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)

   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.

   以下は最も一般的な使用例です:

      >>> import urllib.request
      >>> local_filename, headers = urllib.request.urlretrieve('http://python.org/')
      >>> html = open(local_filename)
      >>> html.close()

   *url* が "http:" スキーム識別子を使用していた場合、任意の引数
   *data* は "POST" リクエストの指定に使用される場合があります (通常の
   リクエストタイプは "GET" です)。引数 *data* は標準 *application/x
   -www-form-urlencoded* 形式のバイトオブジェクトでなければなりません
   。 "urllib.parse.urlencode()" 関数を参照してください。

   "urlretrieve()" は、予想 (これは *Content-Length* ヘッダーにより通
   知されるサイズです) よりも取得できるデータ量が少ないことを検知した
   場合、 "ContentTooShortError" を発生します。これは、例えば、ダウン
   ロードが中断された場合などに発生します。

   *Content-Length* はデータ量の下限です: 読み込むデータ量がこれを超え
   ている場合 urlretrieve はそれらも読み込みますが、利用できるデータが
   これを下回った場合、例外が送出されます。

   このような場合にもダウンロードされたデータを取得することは可能で、
   これは exception インスタンスの "content" 属性に保存されています。

   *Content-Length* ヘッダーが与えられなれけば urlretrieve はダウンロ
   ードしたデータのサイズをチェックできません。この場合ダウンロードは
   正常に完了したとみなすしかありません。

urllib.request.urlcleanup()

   以前の "urlretrieve()" 呼び出し後に残っているかもしれない一時ファイ
   ルをクリーンアップします。

class urllib.request.URLopener(proxies=None, **x509)

   バージョン 3.3 で非推奨.

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

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

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

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

   "URLopener" オブジェクトはサーバーがエラーコードを返した場合に
   "OSError" 例外を送出します。

   open(fullurl, data=None)

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

      This method always quotes *fullurl* using "quote()".

   open_unknown(fullurl, data=None)

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

   retrieve(url, filename=None, reporthook=None, data=None)

      *url* の内容を取得し、*filename* に保存します。戻り値は、ローカ
      ルファイル名と、レスポンスヘッダーが含まれる
      "email.message.Message" (リモート URL の場合) か "None" (ローカ
      ル URL の場合) からなるタプルになります。呼び出し側は、その後
      *filename* を開いてその内容を読み込まなければなりません。
      *filename* が与えられず、URL がローカルファイルを参照している場
      合、入力ファイル名が返されます。URL がローカルでなく、*filename*
      が与えられていない場合、ファイル名は入力 URL のパスの最後の構成
      要素のサフィックスとマッチするサフィックスを持つ
      "tempfile.mktemp()" の出力になります。*reporthook* が与えられて
      いる場合、3 つの数値 (チャンク数、読み込んだチャンクの最大サイズ
      、および総ダウンロードサイズ --- 不明の場合は -1) の引数を受け取
      る関数でなければなりません。これは開始時に 1 回と、ネットワーク
      からデータのチャンクを読み込む度に呼び出されます。*reporthook*
      はローカル URL に対しては無視されます。

      *url* が "http:" スキーム識別子を使用していた場合、任意の引数
      *data* は "POST" リクエストの指定に使用される場合があります (通
      常のリクエストタイプは "GET" です)。引数 *data* は標準
      *application/x-www-form-urlencoded* 形式でなければなりません。
      "urllib.parse.urlencode()" 関数を参照してください。

   version

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

class urllib.request.FancyURLopener(...)

   バージョン 3.3 で非推奨.

   "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 認証で使われます。

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


"urllib.request" の制限事項
===========================

* 現在、次のプロトコルのみサポートされています: HTTP (バージョン 0.9
  および 1.0)、FTP、ローカルファイル、およびデータ URL

  バージョン 3.4 で変更: データ URL サポートが追加されました。

* "urlretrieve()" のキャッシュ機能は、誰かが Expiration time ヘッダー
  の正しい処理をハックする時間を見つけるまで無効にされています。

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

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

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

* "urlopen()" あるいは "urlretrieve()" が返すデータはサーバーから返さ
  れた生データです。これは (画像のような) バイナリ、プレーンテキスト、
  あるいは (例えば) HTML などになります。HTTP プロトコルはレスポンスヘ
  ッダー内でタイプ情報を提供しており、*Content-Type* ヘッダーを見るこ
  とで調査できます。返されたデータが HTML の場合、モジュール
  "html.parser" を使用してこれを解析できます。

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


"urllib.response" --- urllib で使用するレスポンスクラス
*******************************************************

"urllib.response" モジュールは、"read()" および "readline()" を含む 最
小限のファイルライクインターフェースを定義する関数およびクラスを定義し
ています。代表的なレスポンスオブジェクトは addinfourl インスタンスで、
レスポンスヘッダーを返す "info()" メソッドおよび URL を返す "geturl()"
メソッドを定義しています。このモジュールで定義された関数は、
"urllib.request" モジュール内で使用されます。
