python 3.7.4中的代码当url具有中文字符时,出现问题。UnicodeEncodeError:“ latin-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)
urllib
上带有有效的URL,因此您需要事先对其进行修复。
URLs只能包含US-ASCII编码字符集的图形可打印字符。要在URL中包含其他字符,必须先用punycode和/或percent-encoding对其进行编码。浏览器会自动执行此操作。我强烈建议您使用Requests
模块代替Requests
。
参见:
URL - Internationalized URL的每个部分都需要进行punycode编码(包括组成host的net_loc)。需要对path,params和query进行百分比编码(使用each domain label。
在您的简单情况下,urllib.parse.quote()
是net_loc,并且没有path,params或query。
用:替换此行(医疗器械耗材.cn
):
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
将不再抱怨。