python 3.7.4中的代码,当url有中文字符时,问题就出现了。UnicodeEncodeError:拉丁-1编解码器无法对位置0-5中的字符进行编码:序数不在范围内(256)
import string
url1 = 'http://'
url2 = '医疗器械耗材.cn'
url2 = urllib.parse.quote(url2, safe=string.printable)
url = url1 + url2
header = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
req = request.Request(url)
req.add_header('User-Agent', header)
html = ''
with request.urlopen(req) as f:
html = f.read().decode('utf-8')
print(html)发布于 2020-03-29 16:56:33
urllib on接受有效的URL,因此您需要事先修复它。
URLs只能包含US-ASCII码字符集的图形可打印字符。要在URL中包含其他字符,必须首先使用和/或对其进行编码。浏览器会自动执行此操作。我强烈建议您不要使用urllib,而使用Requests模块。
请参见:
的每个部分都需要进行双码编码(包括组成主机的 )。需要对路径、参数和查询进行百分比编码(使用urllib.parse.quote()。
在您的简单示例中,医疗器械耗材.cn是net_loc,并且没有路径、参数或查询。
将此行(url2 = urllib.parse.quote(url2, safe=string.printable))替换为:
import encodings.idna
url2 = ".".join(encodings.idna.ToASCII(label).decode("ascii") for label in url2.split("."))url2现在是xn--ekru7e84uhjb2x6a40o.cn,urllib不会再抱怨了。
https://stackoverflow.com/questions/59656188
复制相似问题