blob: 2008bdfe3e749d770714cc3a72619e595501bcf8 [file] [log] [blame]
Georg Brandl8ec7f652007-08-15 14:28:01 +00001:mod:`urllib` --- Open arbitrary resources by URL
2=================================================
3
4.. module:: urllib
5 :synopsis: Open an arbitrary network resource by URL (requires sockets).
6
Brett Cannon8bb8fa52008-07-02 01:57:08 +00007.. note::
8 The :mod:`urllib` module has been split into parts and renamed in
Ezio Melotti510ff542012-05-03 19:21:40 +03009 Python 3 to :mod:`urllib.request`, :mod:`urllib.parse`,
Brett Cannon8bb8fa52008-07-02 01:57:08 +000010 and :mod:`urllib.error`. The :term:`2to3` tool will automatically adapt
Ezio Melotti510ff542012-05-03 19:21:40 +030011 imports when converting your sources to Python 3.
Brett Cannon8bb8fa52008-07-02 01:57:08 +000012 Also note that the :func:`urllib.urlopen` function has been removed in
Ezio Melotti510ff542012-05-03 19:21:40 +030013 Python 3 in favor of :func:`urllib2.urlopen`.
Georg Brandl8ec7f652007-08-15 14:28:01 +000014
15.. index::
16 single: WWW
17 single: World Wide Web
18 single: URL
19
20This module provides a high-level interface for fetching data across the World
21Wide Web. In particular, the :func:`urlopen` function is similar to the
22built-in function :func:`open`, but accepts Universal Resource Locators (URLs)
23instead of filenames. Some restrictions apply --- it can only open URLs for
24reading, and no seek operations are available.
25
Sandro Tosi71a5ea02011-08-12 19:11:24 +020026.. warning:: When opening HTTPS URLs, it does not attempt to validate the
Antoine Pitrou66bfda82010-09-29 11:30:52 +000027 server certificate. Use at your own risk!
28
29
Georg Brandl62647652008-01-07 18:23:27 +000030High-level interface
31--------------------
Georg Brandl8ec7f652007-08-15 14:28:01 +000032
33.. function:: urlopen(url[, data[, proxies]])
34
R David Murrayc7b8f802012-08-15 11:22:58 -040035 Open a network object denoted by a URL for reading. If the URL does not
36 have a scheme identifier, or if it has :file:`file:` as its scheme
37 identifier, this opens a local file (without :term:`universal newlines`);
38 otherwise it opens a socket to a server somewhere on the network. If the
39 connection cannot be made the :exc:`IOError` exception is raised. If all
40 went well, a file-like object is returned. This supports the following
41 methods: :meth:`read`, :meth:`readline`, :meth:`readlines`, :meth:`fileno`,
42 :meth:`close`, :meth:`info`, :meth:`getcode` and :meth:`geturl`. It also
43 has proper support for the :term:`iterator` protocol. One caveat: the
44 :meth:`read` method, if the size argument is omitted or negative, may not
45 read until the end of the data stream; there is no good way to determine
Georg Brandl8ec7f652007-08-15 14:28:01 +000046 that the entire stream from a socket has been read in the general case.
47
Georg Brandl9b0d46d2008-01-20 11:43:03 +000048 Except for the :meth:`info`, :meth:`getcode` and :meth:`geturl` methods,
49 these methods have the same interface as for file objects --- see section
50 :ref:`bltin-file-objects` in this manual. (It is not a built-in file object,
51 however, so it can't be used at those few places where a true built-in file
52 object is required.)
Georg Brandl8ec7f652007-08-15 14:28:01 +000053
54 .. index:: module: mimetools
55
56 The :meth:`info` method returns an instance of the class
Senthil Kumaran1c919a62010-06-29 13:28:20 +000057 :class:`mimetools.Message` containing meta-information associated with the
Georg Brandl8ec7f652007-08-15 14:28:01 +000058 URL. When the method is HTTP, these headers are those returned by the server
59 at the head of the retrieved HTML page (including Content-Length and
60 Content-Type). When the method is FTP, a Content-Length header will be
61 present if (as is now usual) the server passed back a file length in response
62 to the FTP retrieval request. A Content-Type header will be present if the
63 MIME type can be guessed. When the method is local-file, returned headers
64 will include a Date representing the file's last-modified time, a
65 Content-Length giving file size, and a Content-Type containing a guess at the
66 file's type. See also the description of the :mod:`mimetools` module.
67
68 The :meth:`geturl` method returns the real URL of the page. In some cases, the
69 HTTP server redirects a client to another URL. The :func:`urlopen` function
70 handles this transparently, but in some cases the caller needs to know which URL
71 the client was redirected to. The :meth:`geturl` method can be used to get at
72 this redirected URL.
73
Georg Brandl9b0d46d2008-01-20 11:43:03 +000074 The :meth:`getcode` method returns the HTTP status code that was sent with the
75 response, or ``None`` if the URL is no HTTP URL.
76
Georg Brandl8ec7f652007-08-15 14:28:01 +000077 If the *url* uses the :file:`http:` scheme identifier, the optional *data*
78 argument may be given to specify a ``POST`` request (normally the request type
79 is ``GET``). The *data* argument must be in standard
80 :mimetype:`application/x-www-form-urlencoded` format; see the :func:`urlencode`
81 function below.
82
83 The :func:`urlopen` function works transparently with proxies which do not
84 require authentication. In a Unix or Windows environment, set the
85 :envvar:`http_proxy`, or :envvar:`ftp_proxy` environment variables to a URL that
86 identifies the proxy server before starting the Python interpreter. For example
87 (the ``'%'`` is the command prompt)::
88
89 % http_proxy="http://www.someproxy.com:3128"
90 % export http_proxy
91 % python
92 ...
93
Georg Brandl22350112008-01-20 12:05:43 +000094 The :envvar:`no_proxy` environment variable can be used to specify hosts which
95 shouldn't be reached via proxy; if set, it should be a comma-separated list
96 of hostname suffixes, optionally with ``:port`` appended, for example
97 ``cern.ch,ncsa.uiuc.edu,some.host:8080``.
98
Georg Brandl8ec7f652007-08-15 14:28:01 +000099 In a Windows environment, if no proxy environment variables are set, proxy
100 settings are obtained from the registry's Internet Settings section.
101
102 .. index:: single: Internet Config
103
Senthil Kumaran45a505f2009-10-18 01:24:41 +0000104 In a Mac OS X environment, :func:`urlopen` will retrieve proxy information
105 from the OS X System Configuration Framework, which can be managed with
106 Network System Preferences panel.
107
Georg Brandl8ec7f652007-08-15 14:28:01 +0000108
109 Alternatively, the optional *proxies* argument may be used to explicitly specify
110 proxies. It must be a dictionary mapping scheme names to proxy URLs, where an
111 empty dictionary causes no proxies to be used, and ``None`` (the default value)
112 causes environmental proxy settings to be used as discussed above. For
113 example::
114
115 # Use http://www.someproxy.com:3128 for http proxying
116 proxies = {'http': 'http://www.someproxy.com:3128'}
117 filehandle = urllib.urlopen(some_url, proxies=proxies)
118 # Don't use any proxies
119 filehandle = urllib.urlopen(some_url, proxies={})
120 # Use proxies from environment - both versions are equivalent
121 filehandle = urllib.urlopen(some_url, proxies=None)
122 filehandle = urllib.urlopen(some_url)
123
Georg Brandl8ec7f652007-08-15 14:28:01 +0000124 Proxies which require authentication for use are not currently supported; this
125 is considered an implementation limitation.
126
127 .. versionchanged:: 2.3
128 Added the *proxies* support.
129
Georg Brandl22350112008-01-20 12:05:43 +0000130 .. versionchanged:: 2.6
131 Added :meth:`getcode` to returned object and support for the
132 :envvar:`no_proxy` environment variable.
Georg Brandlc62ef8b2009-01-03 20:55:06 +0000133
Brett Cannon8bb8fa52008-07-02 01:57:08 +0000134 .. deprecated:: 2.6
Ezio Melotti510ff542012-05-03 19:21:40 +0300135 The :func:`urlopen` function has been removed in Python 3 in favor
Brett Cannon8bb8fa52008-07-02 01:57:08 +0000136 of :func:`urllib2.urlopen`.
Georg Brandl22350112008-01-20 12:05:43 +0000137
Georg Brandl8ec7f652007-08-15 14:28:01 +0000138
139.. function:: urlretrieve(url[, filename[, reporthook[, data]]])
140
141 Copy a network object denoted by a URL to a local file, if necessary. If the URL
142 points to a local file, or a valid cached copy of the object exists, the object
143 is not copied. Return a tuple ``(filename, headers)`` where *filename* is the
144 local file name under which the object can be found, and *headers* is whatever
145 the :meth:`info` method of the object returned by :func:`urlopen` returned (for
146 a remote object, possibly cached). Exceptions are the same as for
147 :func:`urlopen`.
148
149 The second argument, if present, specifies the file location to copy to (if
150 absent, the location will be a tempfile with a generated name). The third
151 argument, if present, is a hook function that will be called once on
152 establishment of the network connection and once after each block read
153 thereafter. The hook will be passed three arguments; a count of blocks
154 transferred so far, a block size in bytes, and the total size of the file. The
155 third argument may be ``-1`` on older FTP servers which do not return a file
156 size in response to a retrieval request.
157
158 If the *url* uses the :file:`http:` scheme identifier, the optional *data*
159 argument may be given to specify a ``POST`` request (normally the request type
160 is ``GET``). The *data* argument must in standard
161 :mimetype:`application/x-www-form-urlencoded` format; see the :func:`urlencode`
162 function below.
163
164 .. versionchanged:: 2.5
165 :func:`urlretrieve` will raise :exc:`ContentTooShortError` when it detects that
166 the amount of data available was less than the expected amount (which is the
167 size reported by a *Content-Length* header). This can occur, for example, when
168 the download is interrupted.
169
170 The *Content-Length* is treated as a lower bound: if there's more data to read,
Eli Benderskyad72bb12011-04-16 15:28:42 +0300171 :func:`urlretrieve` reads more data, but if less data is available, it raises
172 the exception.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000173
174 You can still retrieve the downloaded data in this case, it is stored in the
175 :attr:`content` attribute of the exception instance.
176
Eli Benderskyad72bb12011-04-16 15:28:42 +0300177 If no *Content-Length* header was supplied, :func:`urlretrieve` can not check
178 the size of the data it has downloaded, and just returns it. In this case you
179 just have to assume that the download was successful.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000180
181
182.. data:: _urlopener
183
184 The public functions :func:`urlopen` and :func:`urlretrieve` create an instance
185 of the :class:`FancyURLopener` class and use it to perform their requested
186 actions. To override this functionality, programmers can create a subclass of
187 :class:`URLopener` or :class:`FancyURLopener`, then assign an instance of that
188 class to the ``urllib._urlopener`` variable before calling the desired function.
189 For example, applications may want to specify a different
190 :mailheader:`User-Agent` header than :class:`URLopener` defines. This can be
191 accomplished with the following code::
192
193 import urllib
194
195 class AppURLopener(urllib.FancyURLopener):
196 version = "App/1.7"
197
198 urllib._urlopener = AppURLopener()
199
200
201.. function:: urlcleanup()
202
203 Clear the cache that may have been built up by previous calls to
204 :func:`urlretrieve`.
205
206
Georg Brandl62647652008-01-07 18:23:27 +0000207Utility functions
208-----------------
209
Senthil Kumaran880685f2010-07-22 01:47:30 +0000210.. function:: quote(string[, safe])
Georg Brandl8ec7f652007-08-15 14:28:01 +0000211
212 Replace special characters in *string* using the ``%xx`` escape. Letters,
Senthil Kumaran90161372009-08-31 16:40:27 +0000213 digits, and the characters ``'_.-'`` are never quoted. By default, this
R David Murray1d336512011-06-22 20:00:27 -0400214 function is intended for quoting the path section of the URL. The optional
Senthil Kumaran90161372009-08-31 16:40:27 +0000215 *safe* parameter specifies additional characters that should not be quoted
216 --- its default value is ``'/'``.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000217
218 Example: ``quote('/~connolly/')`` yields ``'/%7econnolly/'``.
219
220
Senthil Kumaran880685f2010-07-22 01:47:30 +0000221.. function:: quote_plus(string[, safe])
Georg Brandl8ec7f652007-08-15 14:28:01 +0000222
223 Like :func:`quote`, but also replaces spaces by plus signs, as required for
Georg Brandl8d31f542009-07-28 18:55:32 +0000224 quoting HTML form values when building up a query string to go into a URL.
225 Plus signs in the original string are escaped unless they are included in
226 *safe*. It also does not have *safe* default to ``'/'``.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000227
228
229.. function:: unquote(string)
230
231 Replace ``%xx`` escapes by their single-character equivalent.
232
233 Example: ``unquote('/%7Econnolly/')`` yields ``'/~connolly/'``.
234
235
236.. function:: unquote_plus(string)
237
238 Like :func:`unquote`, but also replaces plus signs by spaces, as required for
239 unquoting HTML form values.
240
241
242.. function:: urlencode(query[, doseq])
243
Benjamin Peterson53e812a2010-06-06 00:50:58 +0000244 Convert a mapping object or a sequence of two-element tuples to a
Senthil Kumaranbd13f452010-08-09 20:14:11 +0000245 "percent-encoded" string, suitable to pass to :func:`urlopen` above as the
Senthil Kumaran98bc31f2010-06-02 02:19:15 +0000246 optional *data* argument. This is useful to pass a dictionary of form
247 fields to a ``POST`` request. The resulting string is a series of
248 ``key=value`` pairs separated by ``'&'`` characters, where both *key* and
249 *value* are quoted using :func:`quote_plus` above. When a sequence of
250 two-element tuples is used as the *query* argument, the first element of
251 each tuple is a key and the second is a value. The value element in itself
252 can be a sequence and in that case, if the optional parameter *doseq* is
Benjamin Peterson11591c32010-06-06 00:54:29 +0000253 evaluates to *True*, individual ``key=value`` pairs separated by ``'&'`` are
Senthil Kumaran98bc31f2010-06-02 02:19:15 +0000254 generated for each element of the value sequence for the key. The order of
255 parameters in the encoded string will match the order of parameter tuples in
256 the sequence. The :mod:`urlparse` module provides the functions
Georg Brandl8ec7f652007-08-15 14:28:01 +0000257 :func:`parse_qs` and :func:`parse_qsl` which are used to parse query strings
258 into Python data structures.
259
260
261.. function:: pathname2url(path)
262
263 Convert the pathname *path* from the local syntax for a path to the form used in
264 the path component of a URL. This does not produce a complete URL. The return
265 value will already be quoted using the :func:`quote` function.
266
267
268.. function:: url2pathname(path)
269
Senthil Kumaranbd13f452010-08-09 20:14:11 +0000270 Convert the path component *path* from an percent-encoded URL to the local syntax for a
Georg Brandl8ec7f652007-08-15 14:28:01 +0000271 path. This does not accept a complete URL. This function uses :func:`unquote`
272 to decode *path*.
273
274
Senthil Kumaranc9941862010-02-26 00:47:05 +0000275.. function:: getproxies()
276
277 This helper function returns a dictionary of scheme to proxy server URL
Senthil Kumaran8070ddc2012-01-11 01:35:02 +0800278 mappings. It scans the environment for variables named ``<scheme>_proxy``,
279 in case insensitive way, for all operating systems first, and when it cannot
280 find it, looks for proxy information from Mac OSX System Configuration for
281 Mac OS X and Windows Systems Registry for Windows.
Senthil Kumaranc9941862010-02-26 00:47:05 +0000282
283
Georg Brandl62647652008-01-07 18:23:27 +0000284URL Opener objects
285------------------
286
Georg Brandl8ec7f652007-08-15 14:28:01 +0000287.. class:: URLopener([proxies[, **x509]])
288
289 Base class for opening and reading URLs. Unless you need to support opening
290 objects using schemes other than :file:`http:`, :file:`ftp:`, or :file:`file:`,
291 you probably want to use :class:`FancyURLopener`.
292
293 By default, the :class:`URLopener` class sends a :mailheader:`User-Agent` header
294 of ``urllib/VVV``, where *VVV* is the :mod:`urllib` version number.
295 Applications can define their own :mailheader:`User-Agent` header by subclassing
296 :class:`URLopener` or :class:`FancyURLopener` and setting the class attribute
297 :attr:`version` to an appropriate string value in the subclass definition.
298
299 The optional *proxies* parameter should be a dictionary mapping scheme names to
300 proxy URLs, where an empty dictionary turns proxies off completely. Its default
301 value is ``None``, in which case environmental proxy settings will be used if
302 present, as discussed in the definition of :func:`urlopen`, above.
303
304 Additional keyword parameters, collected in *x509*, may be used for
305 authentication of the client when using the :file:`https:` scheme. The keywords
306 *key_file* and *cert_file* are supported to provide an SSL key and certificate;
307 both are needed to support client authentication.
308
309 :class:`URLopener` objects will raise an :exc:`IOError` exception if the server
310 returns an error code.
311
Georg Brandl62647652008-01-07 18:23:27 +0000312 .. method:: open(fullurl[, data])
313
314 Open *fullurl* using the appropriate protocol. This method sets up cache and
315 proxy information, then calls the appropriate open method with its input
316 arguments. If the scheme is not recognized, :meth:`open_unknown` is called.
317 The *data* argument has the same meaning as the *data* argument of
318 :func:`urlopen`.
319
320
321 .. method:: open_unknown(fullurl[, data])
322
323 Overridable interface to open unknown URL types.
324
325
326 .. method:: retrieve(url[, filename[, reporthook[, data]]])
327
328 Retrieves the contents of *url* and places it in *filename*. The return value
329 is a tuple consisting of a local filename and either a
330 :class:`mimetools.Message` object containing the response headers (for remote
331 URLs) or ``None`` (for local URLs). The caller must then open and read the
332 contents of *filename*. If *filename* is not given and the URL refers to a
333 local file, the input filename is returned. If the URL is non-local and
334 *filename* is not given, the filename is the output of :func:`tempfile.mktemp`
335 with a suffix that matches the suffix of the last path component of the input
336 URL. If *reporthook* is given, it must be a function accepting three numeric
337 parameters. It will be called after each chunk of data is read from the
338 network. *reporthook* is ignored for local URLs.
339
340 If the *url* uses the :file:`http:` scheme identifier, the optional *data*
341 argument may be given to specify a ``POST`` request (normally the request type
342 is ``GET``). The *data* argument must in standard
343 :mimetype:`application/x-www-form-urlencoded` format; see the :func:`urlencode`
344 function below.
345
346
347 .. attribute:: version
348
349 Variable that specifies the user agent of the opener object. To get
350 :mod:`urllib` to tell servers that it is a particular user agent, set this in a
351 subclass as a class variable or in the constructor before calling the base
352 constructor.
353
Georg Brandl8ec7f652007-08-15 14:28:01 +0000354
355.. class:: FancyURLopener(...)
356
357 :class:`FancyURLopener` subclasses :class:`URLopener` providing default handling
358 for the following HTTP response codes: 301, 302, 303, 307 and 401. For the 30x
359 response codes listed above, the :mailheader:`Location` header is used to fetch
360 the actual URL. For 401 response codes (authentication required), basic HTTP
361 authentication is performed. For the 30x response codes, recursion is bounded
362 by the value of the *maxtries* attribute, which defaults to 10.
363
364 For all other response codes, the method :meth:`http_error_default` is called
365 which you can override in subclasses to handle the error appropriately.
366
367 .. note::
368
369 According to the letter of :rfc:`2616`, 301 and 302 responses to POST requests
370 must not be automatically redirected without confirmation by the user. In
371 reality, browsers do allow automatic redirection of these responses, changing
372 the POST to a GET, and :mod:`urllib` reproduces this behaviour.
373
374 The parameters to the constructor are the same as those for :class:`URLopener`.
375
376 .. note::
377
378 When performing basic authentication, a :class:`FancyURLopener` instance calls
379 its :meth:`prompt_user_passwd` method. The default implementation asks the
380 users for the required information on the controlling terminal. A subclass may
381 override this method to support more appropriate behavior if needed.
382
Georg Brandl62647652008-01-07 18:23:27 +0000383 The :class:`FancyURLopener` class offers one additional method that should be
384 overloaded to provide the appropriate behavior:
385
386 .. method:: prompt_user_passwd(host, realm)
387
388 Return information needed to authenticate the user at the given host in the
389 specified security realm. The return value should be a tuple, ``(user,
390 password)``, which can be used for basic authentication.
391
392 The implementation prompts for this information on the terminal; an application
393 should override this method to use an appropriate interaction model in the local
394 environment.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000395
396.. exception:: ContentTooShortError(msg[, content])
397
398 This exception is raised when the :func:`urlretrieve` function detects that the
399 amount of the downloaded data is less than the expected amount (given by the
400 *Content-Length* header). The :attr:`content` attribute stores the downloaded
401 (and supposedly truncated) data.
402
403 .. versionadded:: 2.5
404
Georg Brandl62647652008-01-07 18:23:27 +0000405
406:mod:`urllib` Restrictions
407--------------------------
Georg Brandl8ec7f652007-08-15 14:28:01 +0000408
409 .. index::
410 pair: HTTP; protocol
411 pair: FTP; protocol
412
413* Currently, only the following protocols are supported: HTTP, (versions 0.9 and
414 1.0), FTP, and local files.
415
416* The caching feature of :func:`urlretrieve` has been disabled until I find the
417 time to hack proper processing of Expiration time headers.
418
419* There should be a function to query whether a particular URL is in the cache.
420
421* For backward compatibility, if a URL appears to point to a local file but the
422 file can't be opened, the URL is re-interpreted using the FTP protocol. This
423 can sometimes cause confusing error messages.
424
425* The :func:`urlopen` and :func:`urlretrieve` functions can cause arbitrarily
426 long delays while waiting for a network connection to be set up. This means
427 that it is difficult to build an interactive Web client using these functions
428 without using threads.
429
430 .. index::
431 single: HTML
432 pair: HTTP; protocol
433 module: htmllib
434
435* The data returned by :func:`urlopen` or :func:`urlretrieve` is the raw data
436 returned by the server. This may be binary data (such as an image), plain text
437 or (for example) HTML. The HTTP protocol provides type information in the reply
438 header, which can be inspected by looking at the :mailheader:`Content-Type`
439 header. If the returned data is HTML, you can use the module :mod:`htmllib` to
440 parse it.
441
442 .. index:: single: FTP
443
444* The code handling the FTP protocol cannot differentiate between a file and a
445 directory. This can lead to unexpected behavior when attempting to read a URL
446 that points to a file that is not accessible. If the URL ends in a ``/``, it is
447 assumed to refer to a directory and will be handled accordingly. But if an
448 attempt to read a file leads to a 550 error (meaning the URL cannot be found or
449 is not accessible, often for permission reasons), then the path is treated as a
450 directory in order to handle the case when a directory is specified by a URL but
451 the trailing ``/`` has been left off. This can cause misleading results when
452 you try to fetch a file whose read permissions make it inaccessible; the FTP
453 code will try to read it, fail with a 550 error, and then perform a directory
454 listing for the unreadable file. If fine-grained control is needed, consider
Éric Araujoc75f2652011-03-20 18:34:24 +0100455 using the :mod:`ftplib` module, subclassing :class:`FancyURLopener`, or changing
Georg Brandl8ec7f652007-08-15 14:28:01 +0000456 *_urlopener* to meet your needs.
457
458* This module does not support the use of proxies which require authentication.
459 This may be implemented in the future.
460
461 .. index:: module: urlparse
462
463* Although the :mod:`urllib` module contains (undocumented) routines to parse
464 and unparse URL strings, the recommended interface for URL manipulation is in
465 module :mod:`urlparse`.
466
467
Georg Brandl8ec7f652007-08-15 14:28:01 +0000468.. _urllib-examples:
469
470Examples
471--------
472
473Here is an example session that uses the ``GET`` method to retrieve a URL
474containing parameters::
475
476 >>> import urllib
477 >>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
478 >>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
479 >>> print f.read()
480
481The following example uses the ``POST`` method instead::
482
483 >>> import urllib
484 >>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
485 >>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
486 >>> print f.read()
487
488The following example uses an explicitly specified HTTP proxy, overriding
489environment settings::
490
491 >>> import urllib
492 >>> proxies = {'http': 'http://proxy.example.com:8080/'}
493 >>> opener = urllib.FancyURLopener(proxies)
494 >>> f = opener.open("http://www.python.org")
495 >>> f.read()
496
497The following example uses no proxies at all, overriding environment settings::
498
499 >>> import urllib
500 >>> opener = urllib.FancyURLopener({})
501 >>> f = opener.open("http://www.python.org/")
502 >>> f.read()
503