urlopen expects a string, but it will attempt to encode it to latin-1.
Therefore if you have an IDN, this is what will happen with certain characters:
>>> from urllib.request import urlopen>>> url = 'https://ᐁ.cc'>>> urlopen(url)Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.7/urllib/request.py", line 222, in urlopen return opener.open(url, data, timeout) File "/usr/lib/python3.7/urllib/request.py", line 525, in open response = self._open(req, data) File "/usr/lib/python3.7/urllib/request.py", line 543, in _open '_open', req) File "/usr/lib/python3.7/urllib/request.py", line 503, in _call_chain result = func(*args) File "/usr/lib/python3.7/urllib/request.py", line 1360, in https_open context=self._context, check_hostname=self._check_hostname) File "/usr/lib/python3.7/urllib/request.py", line 1317, in do_open encode_chunked=req.has_header('Transfer-encoding')) File "/usr/lib/python3.7/http/client.py", line 1229, in request self._send_request(method, url, body, headers, encode_chunked) File "/usr/lib/python3.7/http/client.py", line 1270, in _send_request self.putheader(hdr, value) File "/usr/lib/python3.7/http/client.py", line 1202, in putheader values[i] = one_value.encode('latin-1')UnicodeEncodeError: 'latin-1' codec can't encode character '\u1401' in position 0: ordinal not in range(256)