Не удается открыть URL Unicode с помощью Python - PullRequest
9 голосов
/ 16 декабря 2009

Используя Python 2.5.2 и Linux Debian, я пытаюсь получить контент с испанского URL, который содержит испанский символ 'í':

import urllib
url = u'http://mydomain.es/índice.html'
content = urllib.urlopen(url).read()

Я получаю эту ошибку:

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xe1' в позиции 8: порядковый номер не в диапазоне (128)

Я пытался использовать перед передачей URL для urllib это:

url = urllib.quote(url)

и это:

url = url.encode('UTF-8')

но они не работали.

Можете ли вы сказать мне, что я делаю неправильно?

Ответы [ 5 ]

7 голосов
/ 16 декабря 2009

Это работает для меня:

#!/usr/bin/env python
# define source file encoding, see: http://www.python.org/dev/peps/pep-0263/
# -*- coding: utf-8 -*-

import urllib
url = u'http://example.com/índice.html'
content = urllib.urlopen(url.encode("UTF-8")).read()
4 голосов
/ 16 декабря 2009

Кодирование URL как utf-8, должно было сработать. Интересно, правильно ли закодирован ваш исходный файл и знает ли его интерпретатор. Если ваш исходный файл Python, например, сохранен как UTF-8, то у вас должно быть

# coding=UTF-8

в качестве первой или второй строки.

import urllib
url = u'http://mydomain.es/índice.html'
content = urllib.urlopen(url.encode('utf-8')).read()

у меня работает.

Редактировать: также имейте в виду, что текст Unicode в интерактивном сеансе Python (через IDLE или консоль) сопряжен с трудностями, связанными с кодированием В этих случаях вы должны использовать литералы Unicode (например, \ u00ED в вашем случае).

3 голосов
/ 16 декабря 2009

Это работает для меня. Убедитесь, что вы используете довольно свежую версию Python, и ваша кодировка файла правильная. Вот мой код:

# -*- coding: utf-8 -*-
import urllib
url = u'http://mydomain.es/índice.html'
url = url.encode('utf-8')
content = urllib.urlopen(url).read()

(mydomain.es не существует, поэтому поиск DNS завершается неудачно, но к этому моменту нет проблем с юникодом.)

3 голосов
/ 16 декабря 2009

В соответствии с применимым стандартом, RFC 1378 , URL-адреса могут содержать только символы ASCII. Хорошее объяснение здесь , и я цитирую:

"... только буквенно-цифровые символы [0-9a-zA-Z], специальные символы "$ -_. +! * '()," [не включая кавычки - ред.], и зарезервированные символы, используемые для их зарезервированные цели могут быть использованы не закодирован в URL. "

Как показывают приведенные мной URL-адреса, это, вероятно, означает, что вам придется заменить этот «строчный i с острым акцентом» на «% ED».

0 голосов
/ 16 апреля 2019

У меня сейчас похожий случай. Я пытаюсь загрузить изображения. Я получаю URL-адреса с сервера в файле JSON. Некоторые изображения содержат символы не ASCII. Это выдает ошибку:

for image in product["images"]: 
    filename = os.path.basename(image) 
    filepath = product_path + "/" + filename 
    urllib.request.urlretrieve(image, filepath) # error!

UnicodeEncodeError: кодек 'ascii' не может кодировать символ '\ xc7' в позиции ...


Я пытался использовать .encode("UTF-8"), но не могу сказать, что это помогло:

# coding=UTF-8
import urllib
url = u"http://example.com/wp-content/uploads/2018/09/İMAGE-1.png"
url = url.encode("UTF-8")
urllib.request.urlretrieve(url, "D:\image-1.jpg")

Это просто выдает еще одну ошибку:

TypeError: нельзя использовать строковый шаблон для байтовоподобного объекта


Тогда я дал urllib.parse.quote(url) идти:

import urllib
url = "http://example.com/wp-content/uploads/2018/09/İMAGE-1.png"
url = urllib.parse.quote(url)
urllib.request.urlretrieve(url, "D:\image-1.jpg")

и снова выдается еще одна ошибка:

ValueError: неизвестный тип URL: 'http% 3A // example.com / wp-content / uploads / 2018/09 /% C4% B0MAGE-1.png'

: в "http://..." также сбежал, и я думаю, что это является причиной проблемы.

Итак, я нашел обходной путь. Я просто цитирую / избегаю пути, а не весь URL.

import urllib.request
import urllib.parse
url = "http://example.com/wp-content/uploads/2018/09/İMAGE-1.png"
url = urllib.parse.urlparse(url)
url = url.scheme + "://" + url.netloc + urllib.parse.quote(url.path)
urllib.request.urlretrieve(url, "D:\image-1.jpg")

Вот как выглядит URL: "http://example.com/wp-content/uploads/2018/09/%C4%B0MAGE-1.png", и теперь я могу загрузить изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...