私は奇妙な状況にあります:
私はこのようなURLをカーリングしています:
def check_urlstatus(url):
h = httplib2.Http()
try:
resp = h.request("http://" + url, 'HEAD')
if int(resp[0]['status']) < 400:
return 'ok'
else:
return 'bad'
except httplib2.ServerNotFoundError:
return 'bad'
私がこれをテストしようとすると:
if check_urlstatus('.f.de') == "bad": #<--- error happening here
#..
#..
それは言っています:
UnicodeError: label empty or too long
私がここで引き起こしている問題は何ですか?
[〜#〜] edit [〜#〜]:これがidnaのトレースバックです。おそらく、入力を.
で分割しようとします。この場合、最初のラベルは空で、最初の.
の前のペースです。
問題は、国際化ドメイン名の変換方法を規定する IDNA
rules に従ってURLを適切にエンコードできないことです。
ASCIIと非ASCII形式のドメイン名の間の変換は、ToASCIIおよびToUnicodeと呼ばれるアルゴリズムによって実行されます。これらのアルゴリズムは、ドメイン名全体ではなく、個々のラベルに適用されます。たとえば、ドメイン名がwww.example.comの場合、ラベルはwww、example、comです。ToASCIIまたはToUnicodeがこれらのそれぞれに適用されます。 3つ別々に。
これら2つのアルゴリズムの詳細は複雑であり、RFC 3490で指定されています。以下に、それらの機能の概要を示します。
ToASCIIは変更されませんASCII label、ただし、ラベルがドメインネームシステムに適していない場合は失敗します。指定されている場合少なくとも1つの非ASCII文字を含むラベルであるToASCIIは、Nameprepアルゴリズムを適用します。このアルゴリズムは、ラベルを小文字に変換して他の正規化を実行し、Punycode [16を使用して結果をASCII ] 4文字の文字列 "xn--"を付加する前。[17]この4文字の文字列は、ASCII互換エンコーディング(ACE)プレフィックス)と呼ばれ、Punycodeでエンコードされたラベルを区別するために使用されます。通常のASCIIラベルから。ToASCIIアルゴリズムはいくつかの方法で失敗する可能性があります。たとえば、最終的な文字列がDNS名の63文字の制限を超える可能性があります。ToASCIIが失敗するラベルは使用できません。国際化されたドメイン名で。
あなたの場合、 ''(空白)は有効なドメイン名文字ではなく、次のようになります。
>>> '.f.de'.encode('idna')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/encodings/idna.py", line 164, in encode
result.append(ToASCII(label))
File "/usr/lib/python2.6/encodings/idna.py", line 73, in ToASCII
raise UnicodeError("label empty or too long")
UnicodeError: label empty or too long
ドメイン名を「a.f.de」に変更しても、この例外は発生しません。