Как да поискате 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

Разгледайте следния код:

trait Trait {
  type X
  type Y[_ <: X]
} 

type T[X0,Y0[_ <: X0]] = Trait { type X = X0; type Y[S <: X0] = Y0[S] }

class TraitImpl extends Trait {
  override type X = Int
  override type Y[I <: Int] = List[I]
}

case class Wrap[X,Y[_ <: X]](t: T[X,Y])

val wrap = new Wrap[Int,List](new TraitImpl) // why explicitly write types?

Защо изрично да пишете типове, вижте другия ми въпрос.
Сега искам да съвпадам с образец на wrap:

wrap match {
  case w: Wrap[_,_]      => // error
  case w: Wrap[_,_[_]]   => // error
  case Wrap(t)           => // error
  case w: Wrap[Int,List] => // fine
}

Свикнал съм да имам няколко възможности за съпоставяне на шаблони, по-специално последните два оператора case, понякога първият.
Но нито един от първите три case не работи, защо? (особено case Wrap(t) =>)?

  -  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
@AbdyresulCharyev: о, да, използването на байтов низ вместо 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 преди string quot :) след като го сложих, проработи. Предполагам, че дефинирате низа като уникод низ. Благодаря. - person Abdyresul Charyev; 28.03.2012