我遇到一个奇怪的情况:
我正在卷曲这样的网址:
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
我在这里引起什么问题?
编辑 :这是idna的追溯。我猜想,它会尝试按分割输入.,在这种情况下,第一个标签为空,这是第一个标签之前的速度.。
.
问题是您的URL无法按照IDNArules正确编码,该规则控制如何转换国际化域名:
IDNA
域名的ASCII和非ASCII形式之间的转换是通过称为ToASCII和ToUnicode的算法完成的。这些算法不适用于整个域名,而是应用于单个标签。例如, **如果域名为www.example.com,则标签为www,example和com。 ToASCII或ToUnicode 分别应用于这三个 。** 这两种算法的细节很复杂,并且在RFC 3490中进行了指定。以下概述了它们的功能。 ToASCII保留任何ASCII标签不变, 但如果该标签不适用于域名系统 , 则会失败。 如果给定的标签至少包含一个非ASCII字符,则ToASCII将应用Nameprep算法,该算法会将标签转换为小写并执行其他归一化处理,然后在使用四个字符之前,先使用Punycode [16]将结果转换为ASCII。字符串“ xn-”。[17] 这四个字符的字符串称为ASCII兼容编码(ACE)前缀,用于区分Punycode编码的标签和普通的ASCII标签。ToASCII算法可能会以多种方式失败。例如,最终字符串可能超过DNS名称的63个字符的限制。ToASCII失败的标签不能在国际化域名中使用。
域名的ASCII和非ASCII形式之间的转换是通过称为ToASCII和ToUnicode的算法完成的。这些算法不适用于整个域名,而是应用于单个标签。例如, **如果域名为www.example.com,则标签为www,example和com。 ToASCII或ToUnicode 分别应用于这三个 。**
这两种算法的细节很复杂,并且在RFC 3490中进行了指定。以下概述了它们的功能。
ToASCII保留任何ASCII标签不变, 但如果该标签不适用于域名系统 , 则会失败。 如果给定的标签至少包含一个非ASCII字符,则ToASCII将应用Nameprep算法,该算法会将标签转换为小写并执行其他归一化处理,然后在使用四个字符之前,先使用Punycode [16]将结果转换为ASCII。字符串“ xn-”。[17] 这四个字符的字符串称为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
如果将域名更改为“ afde”,则不应引发此异常。