Python urlopen UnicodeEncodeError:'latin-1'编解码器无法在位置0-5处编码字符:序数不在范围内(256)

问题描述 投票:0回答:1

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)
python-3.x urllib3
1个回答
0
投票

urllib上带有有效的URL,因此您需要事先对其进行修复。

URLs只能包含US-ASCII编码字符集的图形可打印字符。要在URL中包含其他字符,必须先用punycode和/或percent-encoding对其进行编码。浏览器会自动执行此操作。我强烈建议您使用Requests模块代替Requests

参见:

URL - Internationalized URL的每个部分都需要进行punycode编码(包括组成hostnet_loc)。需要对pathparamsquery进行百分比编码(使用each domain label

在您的简单情况下,urllib.parse.quote()net_loc,并且没有pathparamsquery

用:替换此行(医疗器械耗材.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将不再抱怨。

© www.soinside.com 2019 - 2024. All rights reserved.