Не мога да поискам URL адрес „http://www.besondere-raumdüfte.de“ с urllib2.urlopen().
Опитах се да кодирам низ с помощта на urllib.urlencode с utf-8, idna, ascii, но все още не работи.
Повишава URLError: <urlopen error unknown url type
.
Как да поискате URL адрес с различни от уникод символи на основно име на домейн (не параметри) в Python?
Отговори (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
Благодаря, че работи, спомням си, че се опитах да кодирам с 'idna' и urllib2.urlopen низа без u в началото, но прави 'u' преди низа нещо важно.
- person Abdyresul Charyev; 28.03.2012
@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
За да проверя, опитах
urllib2.urlopen(bytes(iri2uri("http://www.besondere-raumdüfte.de")))
, но дава грешка: URLError: ‹urlopen error [Errno 11004] getaddrinfo failed›
- person Abdyresul Charyev; 27.03.2012
Вероятно сте зад защитна стена, погледнете stackoverflow.com/questions/4847649/
- person mandel; 27.03.2012
Странно, но това е защото забравих да сложа u преди string quot :) след като го сложих, проработи. Предполагам, че дефинирате низа като уникод низ. Благодаря.
- person Abdyresul Charyev; 28.03.2012
Разгледайте следния код:
Защо изрично да пишете типове, вижте другия ми въпрос.
Сега искам да съвпадам с образец на
wrap
:Свикнал съм да имам няколко възможности за съпоставяне на шаблони, по-специално последните два оператора
- person Joachim Sauer   schedule 27.03.2012case
, понякога първият.Но нито един от първите три
case
не работи, защо? (особеноcase Wrap(t) =>
)?