Как запросить URL-адрес с символами, отличными от юникода, для основного доменного имени (не параметров) в Python?

Я не могу запросить URL "http://www.besondere-raumdüfte.de" с помощью urllib2.urlopen().
Я пытался закодировать строку, используя urllib.urlencode с utf-8, idna, ascii, но все равно не работает.
Поднимает URLError: <urlopen error unknown url type.


person Abdyresul Charyev    schedule 27.03.2012    source источник
comment
ü не является символом, отличным от Юникода. Едва ли какой-либо символ квалифицируется как символ, отличный от Unicode, потому что Unicode охватывает практически все символы. Это не-ASCII-символ.   -  person Joachim Sauer    schedule 27.03.2012


Ответы (2)


Вам нужно u"http://www.besondere-raumdüfte.de/".encode('idna'). Обратите внимание, что исходная строка является константой Unicode (префикс u).

Результатом является URL-адрес, который можно использовать с urlopen().

Если у вас есть доменное имя с символами, отличными от ASCII, и остальная часть URL-адреса содержит символы, отличные от ASCII, вам необходимо .encode('idna') доменную часть и iri2uri() остальные.

person 9000    schedule 27.03.2012
comment
Спасибо, это работает, я помню, что пытался закодировать с помощью «idna» и urllib2.urlopen строку без u в начале, но имеет ли значение «u» перед строкой. - person Abdyresul Charyev; 28.03.2012
comment
@AbdyresulCaryev: о да, использование байтовой строки вместо Unicode sting — одна из самых частых ошибок, я сам делал это много раз %) - person 9000; 28.03.2012

Вы работаете с iri, а не с uri, вам нужно правильно преобразовать его. Ниже приведен пример того, как это сделать:

from httplib2 import iri2uri

def iri_to_uri(iri):
    """Transform a unicode iri into a ascii uri."""
    if not isinstance(iri, unicode):
        raise TypeError('iri %r should be unicode.' % iri)
    return bytes(iri2uri(iri))

Если у вас есть uri, вы сможете использовать urllib2.

person mandel    schedule 27.03.2012
comment
Для проверки пробовал urllib2.urlopen(bytes(iri2uri("http://www.besondere-raumdüfte.de"))) Но выдает ошибку: URLError: ‹urlopen error [Errno 11004] getaddrinfo failed› - person Abdyresul Charyev; 27.03.2012
comment
Вероятно, вы находитесь за брандмауэром, взгляните на stackoverflow.com/questions/4847649/ - person mandel; 27.03.2012
comment
Забавно, но это потому, что я забыл поставить u перед кавычками :) после того, как я поставил это, это сработало. Я предполагаю, что вы определяете строку как строку Unicode. Спасибо. - person Abdyresul Charyev; 28.03.2012