Pythonのurlopen関数 BASIC認証形式のURLに注意しよう

Python3.6のurllib.request.urlopenは、外部ファイルをメモリ上に読み込むコマンドだ。

ただし、BASIC認証形式のURLに対応していないという弱点がある。

このようなURLでは、エラーが出てしまう。

https://user:password@sample.com/

Traceback (most recent call last):
File “/var/lang/lib/python3.6/http/client.py”, line 885, in _get_hostport
port = int(host[i+1:])
ValueError: invalid literal for int() with base 10: ‘password@sample.com

BASIC認証形式であることを正規表現でチェックし、URLからユーザー名とパスワードから省いた上で、
リクエスト時にAuthorizationヘッダーに含めれば、解決する。