web-dev-qa-db-ja.com

ラベルが空または長すぎる-python urllib2

私は奇妙な状況にあります:

私はこのような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のトレースバックです。おそらく、入力を.で分割しようとします。この場合、最初のラベルは空で、最初の.の前のペースです。

enter image description here

13
doniyor

問題は、国際化ドメイン名の変換方法を規定する 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」に変更しても、この例外は発生しません。

18
Burhan Khalid