首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python urlopen UnicodeEncodeError:‘拉丁语-1’编解码器无法对位置0-5的字符进行编码:序数不在范围内(256)

Python urlopen UnicodeEncodeError:‘拉丁语-1’编解码器无法对位置0-5的字符进行编码:序数不在范围内(256)
EN

Stack Overflow用户
提问于 2020-01-09 09:53:54
回答 1查看 618关注 0票数 2

python 3.7.4中的代码,当url有中文字符时,问题就出现了。UnicodeEncodeError:拉丁-1编解码器无法对位置0-5中的字符进行编码:序数不在范围内(256)

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 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))替换为:

代码语言:javascript
复制
import encodings.idna
url2 = ".".join(encodings.idna.ToASCII(label).decode("ascii") for label in url2.split("."))

url2现在是xn--ekru7e84uhjb2x6a40o.cnurllib不会再抱怨了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59656188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档