Я не могу запросить URL "http://www.besondere-raumdüfte.de" с помощью urllib2.urlopen().
Я пытался закодировать строку, используя urllib.urlencode с utf-8, idna, ascii, но все равно не работает.
Поднимает URLError: <urlopen error unknown url type
.
Как запросить URL-адрес с символами, отличными от юникода, для основного доменного имени (не параметров) в Python?
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
Спасибо, это работает, я помню, что пытался закодировать с помощью «idna» и urllib2.urlopen строку без u в начале, но имеет ли значение «u» перед строкой.
- person Abdyresul Charyev; 28.03.2012
@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
Для проверки пробовал
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 перед кавычками :) после того, как я поставил это, это сработало. Я предполагаю, что вы определяете строку как строку Unicode. Спасибо.
- person Abdyresul Charyev; 28.03.2012