The received bytes have to be decoded with the correct character encoding to be interpreted as text:

import urllib.request

response = urllib.request.urlopen("<http://stackoverflow.com/>")
data = response.read()

encoding = response.info().get_content_charset()
html = data.decode(encoding)
import urllib2
response = urllib2.urlopen("<http://stackoverflow.com/>")
data = response.read()

encoding = response.info().getencoding()
html = data.decode(encoding)