Python urlopen UnicodeEncodeError: код 'latin-1' c не может кодировать символы в позиции 0-5: порядковый номер не в диапазоне (256) - PullRequest
1 голос
/ 09 января 2020

код в python 3.7.4, когда URL имеет китайский символ, возникает проблема. UnicodeEncodeError: код 'latin-1' c не может кодировать символы в позиции 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)

1 Ответ

0 голосов
/ 29 марта 2020

urllib on принимает действительные URL-адреса, поэтому вам необходимо исправить это заранее.

URL-адресов может содержать только графических c печатаемых символов США- Набор кодированных символов ASCII . Чтобы включить другие символы в URL-адрес, они должны быть сначала закодированы с помощью punycode и / или процентное кодирование . Браузеры делают это автоматически. Так же как и модуль Requests, который я настоятельно рекомендую использовать вместо urllib.

См .:

Каждая часть net_lo c должен быть закодирован Punycode (включая каждую метку домена , которая составляет хост ). path , params и query должны кодироваться в процентах (с urllib.parse.quote().

В вашем простом случае 医疗器械耗材.cn net_lo c, и нет path , params или query .

Заменить это строка (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 больше не будет жаловаться.

...