¿Cómo lidiar con la cadena Unicode en la URL en Python3?

# -*- coding: utf-8 -*- # Python3 import urllib import urllib.request as url_req opener = url_req.build_opener() url='http://zh.wikipedia.org/wiki/'+"毛泽东" opener.open(url).read() # opener.open(url.encode("utf-8")).read() # # doesn't work either 

Cuando lo ejecuto, se queja de que:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)

Pero tampoco puedo usar .encode() porque se quejará:

 Traceback (most recent call last): File "t.py", line 8, in  opener.open(url.encode("utf-8")).read() File "/usr/local/Cellar/python3/3.2.2/lib/python3.2/urllib/request.py", line 360, in open req.timeout = timeout AttributeError: 'bytes' object has no attribute 'timeout' 

Alguien sabe como lidiar con eso?

Podría usar urllib.parse.quote () para codificar la sección de ruta de la URL.

 #!/usr/bin/env python3 from urllib.parse import quote from urllib.request import urlopen url = 'http://zh.wikipedia.org/wiki/' + quote("毛泽东") content = urlopen(url).read() 

La fantástica biblioteca de solicitudes hace esto de forma inmediata:

 >>> url='http://zh.wikipedia.org/wiki/'+"毛泽东" >>> import requests >>> r = requests.get(url) >>> len(r.content) 818747 

No puede usar cadenas Unicode arbitrarias como parte de una URL. La URL debe estar correctamente codificada. Vea aquí para más detalles:

http://www.w3schools.com/tags/ref_urlencode.asp

En particular, desea utilizar el método urllib.quote () o urllib.quote_plus () de la API de Python para citar correctamente su URL.

http://docs.python.org/library/urllib.html