Проблема в том, что содержимое URL-адреса сжимается с помощью gzip, который, по-видимому, urlopen не обрабатывает по умолчанию:
>>> r = request.urlopen('https://www.entekhab.ir/')
>>> print(r.info())
Server: sepehr-proxy-1.2-rc3
Content-Type: text/html; charset=utf-8
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Content-Length: 81269
Date: Sat, 28 Sep 2019 14:41:49 GMT
Content-Encoding: gzip
Поэтому перед декодированием необходимо распаковать ответ:
>>> import gzip
>>> bs = gzip.decompress(r.read())
>>> bs.decode('utf-8')[:113]
'<!-- 2019/09/28 18:16:08 --><!DOCTYPE html> <html lang="fa-IR" dir="rtl"> <head> <meta charset="utf-8">'
Как указывает ответ пользователя askaroni, пакет requests
обрабатывает этот случай автоматически, и даже документы Python urllib рекомендуют его использовать.Тем не менее, полезно понять , почему ответ не может быть немедленно декодирован.